原文地址:http://www.cnblogs.com/fannyatg/archive/2012/04/16/2451611.html

------------------------------------------------------------------------------------------------------------------

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

.net Mvc Controller 接收 Json/post方式 数组 字典 类型 复杂对象的更多相关文章

  1. ASP.NET MVC Controller接收ajax post方式发送过来的json对象或数组数据

    本例旨在说明我的一种Controller接收ajax提交(POST)过来的json对象或数组信息的方式,感觉应该有更好的方式,欢迎提出宝贵意见. JSON.stringify(jsonObj)不支持I ...

  2. .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二)

    .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二) .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (一) 上一篇主 ...

  3. .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (一)

    .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二) Json是WEB交互常见的数据,.net core 处理方式是转为强类型,没有对应的强类型会被抛弃,有时 ...

  4. Spring MVC Controller中解析GET方式的中文参数会乱码的问题(tomcat如何解码)

    Spring MVC Controller中解析GET方式的中文参数会乱码的问题 问题描述 在工作上使用突然出现从get获取中文参数乱码(新装机器,tomcat重新下载和配置),查了半天终于找到解决办 ...

  5. .net mvc前台如何接收和解析后台的字典类型的数据 二分搜索算法 window.onunload中使用HTTP请求 网页关闭 OpenCvSharp尝试 简单爬虫

    .net mvc前台如何接收和解析后台的字典类型的数据   很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是 ...

  6. JSon_零基础_007_将JSon格式的"数组"字符串转换为Java对象"数组"

    将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...

  7. JSON字符串和Dictionary字典类型的相互转换

    在开发过程中,往往会遇到数据类型转换的情况,根据自己的业务,可能转换类型有多种,下面就说一下json字符串和字典类型的转换. public static class JsonUntity { /// ...

  8. ASP.NET MVC Controller向View传值方式总结

    Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...

  9. .net mvc前台如何接收和解析后台的字典类型的数据

    很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是没有找到. 今天想记录一下这样一个小的需求的做法.先说一下我 ...

随机推荐

  1. SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性

    原文:SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 ...

  2. 一个C#多线程的工作队列

    多线程添加元素到队列中,队列根据绑定 的事件进行自动处理,可以设置WorkSequential属性来实现对队列处理的单线程(严格顺序处理)或者多线程处理(循序出队,但是 多线程处理,不保证对队列元素的 ...

  3. 产生n bit所有可能的序列

    void binary(int n) { ) printf("%s\n",A); // Assume A is a global variable else { A[n-] = ' ...

  4. 图的深度优先遍历DFS

    图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...

  5. MySQL数据库如何解决大数据量存储问题

    利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开 ...

  6. Calculation(dfs+状压dp)

    Problem 1608 - Calculation Time Limit: 500MS   Memory Limit: 65536KB    Total Submit: 311  Accepted: ...

  7. MediaPlayer本地播放流程解析(一)

    应用场景: MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setOnCompletionListener(new OnComplet ...

  8. HTTP Digest authentication

    (Digest authentication)是一个简单的认证机制,最初是为HTTP协议开发的,因而也常叫做HTTP摘要,在RFC2671中描写叙述.其身份验证机制非常easy,它採用杂凑式(hash ...

  9. Linux常见目录作用

    Linux中一切皆文件 文件类型: 一般文件 - 目录文件 d 链接文件 l 块设备   b    (以块为单位进行操作,比如硬盘) 字符设备 c  (以字符为单位进行操作,比如主存) socket  ...

  10. android 硬件解码学习

    FileInputStream in = new FileInputStream("/sdcard/sample.ts"); String mimeType = "vid ...