.net Mvc Controller 接收 Json/post方式 數組 字典 類型 復雜對象


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);
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM