Asp.net Mvc Controller Json數組接收數組字典 類型 復雜對象
方法一,(最復雜的方法)
擴展ModelBinder 完全自定義一種參數的解析方法。
/// <summary>
/// 模式綁定數組接收器 eg:,接收字符數組:參數標記如 [ModelBinder(typeof(ArrayBind<string>))]string[] arrayValue
/// </summary>
/// <typeparam name="T"></typeparam>
public classArrayBind<T> : IModelBinder
{
private_T GetValue<_T>(ModelBindingContext bindingContext,stringkey)
{
ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(key);
bindingContext.ModelState.SetModelValue(key, valueResult);
return(_T)valueResult.ConvertTo(typeof(_T));
}
#regionIModelBinder 成員
public objectBindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Dictionary<int, T> list =newDictionary<int, T>();
string[] allKey = controllerContext.HttpContext.Request.Form.AllKeys;
foreach(stringkeyinallKey)
{
if(!key.StartsWith(bindingContext.ModelName, StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
string[] _key = key.Split('.');
if(_key.Length !=2)
{
continue;
}
intme =0;
if(int.TryParse(_key[1],outme))
{
list.Add(me, GetValue<T>(bindingContext, key));
}
}
var sort = from kinlist orderby k.Key ascending select k;
returnsort.Select<KeyValuePair<int, T>, T>(C => C.Value).ToArray();
}
#endregion
}
然后在Controller的action方法參數中進行標記,如:
[HttpPost]
publicActionResult Edit([Bind(Prefix ="LevelDescription")][ModelBinder(typeof(ArrayBind<string>))]string[] levelOrder)
{
returnJson(1);
}
方法二,url參數解析法
http://www.domain.com/post?levelOrder=1&levelOrder=2&levelOrder=3&levelOrder=4&levelOrder=5
不推薦這種方法,Url長度有限制,當需要通過URL傳遞的數據量較大時就會出現404錯誤,很恐怖哦。這個“bug”比較隱蔽
方法三,
接收復雜對象數組,Js異步提交數據,
var _lev = {};
_lev["lev[0].Status"] ="5";//這里必須從零開始 名字必須一樣
_lev["lev[1].Status"] ="6";
$.post("Edit", _lev
, function(json) {
if(json =="1") { alert(''成功)}
},"json");
同步提交同理,需要在表單中構造這樣的結構
<input type="text"name="lev[0].Status"value="5"/><input type="text"name="lev[1].Status"value="6"/> 這里會按照parameterName[index].PropertyName的規則來解析屬性。其中,索引必須是連續的且以0開始的正整數。
action方法,如:
[HttpPost]
publicActionResult Edit(Level[] lev)
{
returnJson(lev);
}
如果在action中欲接收一Dictionary 類型值,則變得更加方便,
$("tr[name = 'LeelArea']").each(function(index) {
_lev["levelOrder1["+ index +"].key"] = index;//這里必須從零開始 名字必須一樣
_lev["levelOrder1["+ index +"].value"] = $(this).find("textarea").val();
});
if($(this).valid()) {
$.post("Edit", _lev
, function(json) {
Alert(json);
},"json");
}
這里解析key的方式是尋找parameterName[index].Key這樣的結構、解析value的方式是尋找parameterName[index].Value這樣的結構。如果key或者value是復雜類型(如上面例子中的Information類型),則parameterName[index].Key或parameterName[index].value將被視為前綴(也可以理解為某個類型)而.PropertyName被視為后綴(即某個屬性)。這里的索引也要求必須是以0開始的不間斷的正整數。否則斷開以后的部分將不會被解析。
action方法,如:
[HttpPost]
publicActionResult Edit(Dictionary<int,string> levelOrder)
{
returnJson(1);
}
