.net Mvc Controller 接收 Json/post方式 数组 字典 类型 复杂对象

时间:2022-09-17 18:04:48

原文地址: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&period;NET MVC Controller接收ajax post方式发送过来的json对象或数组数据

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

  2. &period;net core 1&period;1&period;0 MVC 控制器接收Json字串 (JObject对象) &lpar;二)

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

  3. &period;net core 1&period;1&period;0 MVC 控制器接收Json字串 (JObject对象) &lpar;一)

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

  4. Spring MVC Controller中解析GET方式的中文参数会乱码的问题&lpar;tomcat如何解码&rpar;

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

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

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

  6. JSon&lowbar;零基础&lowbar;007&lowbar;将JSon格式的&quot&semi;数组&quot&semi;字符串转换为Java对象&quot&semi;数组&quot&semi;

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

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

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

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

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

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

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

随机推荐

  1. 安装过程中出现PKG&lowbar;CONFIG&lowbar;PATH的问题解决方法

    在安装开源软件的过程中, 经常会碰到提示配置PKG_CONFIG_PATH路径, 或者直接提示没有安装某某库, 但是我们已经安装了啊. 其实造成这种情况的原因很简单, 就是安装的目录不能被依赖程序找到 ...

  2. 基本hibernate DEMO

    Hibernate常用API: 1Configuration: 负责加载主配置文件信息,同时也加载映射关系文件信息. 2SessionFactory 负责创建Session对象. 3Session 数 ...

  3. MySQL笔记汇总

    [目录] MySQL笔记汇总 一.mysql简介 数据简介 结构化查询语言 二.mysql命令行操作 三.数据库(表)更改 表相关 字段相关 索引相关 表引擎操作 四.数据库类型 数字型 字符串型 日 ...

  4. Java中几种日志方案

    .本文记录Java中几种常用的日志解决方案 0x01 Log4j .这应该是一个比较老牌的日志方案了,配置也比较简单,步骤如下 1)添加对应依赖,比如 Gradle 中 dependencies { ...

  5. 手把手教程 Surface如何进行系统恢复?

    手把手教程 Surface如何进行系统恢复? 2015-01-29 05:53:00  [  中关村在线 原创  ]   作者: 周博林 |  责编:周博林 收藏文章 分享到 评论(10) Windo ...

  6. CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow的区别

    http://blog.csdn.net/swimmer2000/archive/2007/10/30/1856213.aspx MFC(VC6.0)的CWnd及其子类中,有如下三个函数:     / ...

  7. hdu 3954 线段树 &lpar;标记&rpar;

    Level up Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. CodeMirror 小册子

    User manual and reference guide      version 5.41.1 用户手册和参考指南 CodeMirror is a code-editor component ...

  9. hdu2222 Keywords Search【AC自动机】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  10. RK3288 mipi屏调试流程

    CPU:RK3288 系统:Android 5.1 1.修改kernel/arch/arm/configs/rockchip_defconfig,打开mipi屏开关 # CONFIG_LCD_GENE ...