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

  • 相关阅读:
    前端+php实现概率抽奖
    rem.js的用法及在浏览器端的适配
    python 使用记录及问题
    python 工具链 虚拟环境和包管理工具 pipenv
    python 工具链 多版本管理工具 pyenv
    python 工具链 包管理工具 pip
    ansible 使用记录
    mongodb connection refused because too many open connections: 819
    wordpress 常用操作
    服务器硬件测试
  • 原文地址:https://www.cnblogs.com/fannyatg/p/2451611.html
Copyright © 2020-2023  润新知