在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收、我传的数组为什么Action的model中接收不到、或者我在ajax的data中设置了一些数组,为什么后台还是接收不了、还有一些怎么传送一个复杂的对象或者Action怎么接收一个复杂的对象等等这些问题。或者有些人遇到复杂的对象或者数组直接就传送个json字符串,然后在Action中把json字符串转成model对象,当然这也是一种做法,但也许不是最优的做法。

一、需求

按照如图的数据格式,传入到Action,用一个UserInfo Model接收,需求非常简单。

分析后我们可以看到,其中爱好是个字符串的数组,用户包含一个公司对象,然后所包含的公司对象中又有个电话数组,用户又包含数组对象,所以我们的Model应该是:

public class UserInfo
{public string Name { get; set; }public int Age { get; set; }public string[] Bobbys { get; set; }public Company Company { get; set; }public Star[] Star { get; set; }
}
public class Company
{public string Name { get; set; }public string Address { get; set; }public string[] Tel { get; set; }
}public class Star
{public string Name { get; set; }public int Age { get; set; }public string Movie { get; set; }
}

二、表单提交扫盲与验证

我们在提交表单时不管是post还是get提交,我们所提交的数据大部分都是键值对的格式,并不会直接传入个json对象至后台,最多也只会传入个字符串的json,这个也许是受ajax data设置的误导,很多人都会认为可以直接设置json对象提交至后台,也许格式简单的Model可以接收到,但是复杂一点的,比如其中包含数组的等,即使json的格式和Model的格式一致,Model并不会接收到前台的提交的数组数据,这个也是我文章刚开始所提的一个问题。

为了验证我说的ajax提交json格式的数据,我们做一下验证。

Action:

[HttpPost]
public ActionResult Index(UserInfo user)
{return Json(user);
}

Ajax:

$.ajax({url: "/",type: "post",data: {"name": "Emrys","age": "26","bobbys": ["足球", "电影"],"company": {"name": "上海xxxxxx公司","address": "上海徐汇区xxxx路","tel": ["021-88888881","021-88888882","021-88888883","021-88888884"]},"star": [{ "name": "成龙", "age": "63", "movie": "十二生肖" },{ "name": "刘亦菲", "age": "18", "movie": "功夫之王" },{ "name": "胡歌", "age": "24", "movie": "琅琊榜" }]},success: function (r) {console.log(r);}
});

这个是我们经常提交的data数据格式,如果我们后台的model格式即使和data的数据格式一模一样,也只有name一项可以正常接收到数据,其他的所有数据都将接收不到,至于为什么。我们看一下jquery给我们转成的键值对的格式就应该知道了,我们从chrome或者火狐的调试工具的network中可以看到提交的格式。

其中数组的格式为:xxxxxx[]的格式,对象中的对象格式为xxxx[yyyyy]格式,我没有探究为什么是这个格式,也许是其他的语言需要这样的格式,php,jsp或者其他的语言吧,但asp.net mvc很明显不需要这样的格式。

后面是毁三观的验证,结果结果竟然全都能用Model接收到数据,接收到了,接收到,接收,接,了,我。。。。。。。。。突然感觉有一百个那个什么飞过啊。。。。。。。。。。

我一度怀疑自己,难道之前做了几年mvc的开发的模型绑定理解错了,之前开发用jquery的ajax转成的格式是不能接收到数据的啊,那是为什么为什么啊。经过探索测试发现,我之前也没有理解错,原来是版本的问题。我测试是用的mvc5做的测试,mvc5可能对jquery ajax转成的格式做了优化,但是mvc5之前的版本是不可以的,这个是重点

那也就是说,如果你用的mvc5做的开发,反而简单了很多,可以直接在ajax的data设置json格式的数据,复杂的,数组都可以,也许微软开发人员也发现了这个问题,在mvc5解决了,我并没有去研究源码的区别,总之呢,mvc5是可以的。那mvc5以前的版本就会遇到我说的那个问题了。

三、模型绑定分析

博客模拟的表单已经可以包含网站开发过程中遇到的大部分的表单格式了,包含一些数组、对象等等。

从以前的开发的mvc项目中,发现了一些模型绑定的规律,区别在于数组和对象中的对象。

下面的图片是手动转成键值对的值,mvc5之前的版本可以适用的格式,当然mvc5也是可以识别的,或者说这个格式是所有的mvc版本都可以适用的格式。

下图是两种格式的对比图

关于其中的规则,自己总结吧,应该很简单了。

有人会问,手动拼的格式应该怎么拼呢,这里经常用的有两种格式。

1、直接拼接字符串

$.ajax({url: "/",type: "post",data: "name=Emrys&age=26&bobbys[0]=足球&star[0].movie=琅琊榜",success: function (r) {console.log(r);}
});

2、javascript对象

var data1 = { name: "Emrys" };
data1.age = 26;
data1["bobbys[0]"] = "足球";
data1["star[0].movie"] = "琅琊榜"; $.ajax({url: "/",type: "post",data: data1,success: function (r) {console.log("xxxxxxxxxxxxxx");console.log(r);}
});

用户可以根据情况选择不同的拼接方式。

四、总结

顺便分享一个技巧,就是当我们拿到一段json的时候,别急着在类中新建model,一个一个类,一个一个的属相敲,vs已经提供了一个很强大的工具,知道的可以忽略本段。

源码地址Github:https://github.com/Emrys5/Asp.MVC-04-ModelBinding

以上就是关于模型绑定的一些应用,本文原创,欢迎拍砖和推荐

系列课程

  • [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
  • [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码
  • [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
  • [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
  • [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript
  • [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的

转载于:https://www.cnblogs.com/emrys5/p/asp-net-mvc-04-modelbinding.html

[asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?相关推荐

  1. [asp.net mvc 奇淫巧技] 05

    一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...

  2. 【C#冷知识系列】(一)那些你知道或者不知道的奇淫巧技

    引子 正如我在个人介绍中所写,我是一个仍然坚持.NET的头铁高级软件工程师,研究C#,.NET已经六年多,一直坚持认为自己的能力不足以教授别人,所以一直没有想法写博客.工作几年,内容涵盖了.NET框架 ...

  3. 开发奇淫巧技Tips(Android篇)

    没事会记录下开发的奇淫巧技,每个tips前都会标明开发语言,有更多更好的奇淫巧技可以发评论或者私聊,可以添加进来 1.Kotlin:View调用此方法传入url加载网络图片,如果是ImageView则 ...

  4. 多行文本注视 php,多行文本进行截断的奇淫巧技

    本篇文章给大家带来的内容是关于多行文本进行截断的奇淫巧技,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 单行文字的截断非常简单,但是多行文字的截断可谓是非常头疼,刚学css时候就为了 ...

  5. asa防火墙升级固件_奇淫巧技 | 在路由器中添加策略,阻止电视系统升级

    上一篇文章「长虹智能电视刷机降级,实现U盘安装第三方应用」中提到系统升级后会出现无法随意安装第三方应用的情况,当完成刷机后为了避免系统自动更新,你需要通过路由器阻止系统更新. 用openwrt类路由器 ...

  6. idea new对象后自动补全_IDEA的quot;奇淫巧技quot;

    本期吉大浪潮俱乐部给大家带来了IDEA的快捷键用法总结.废话不多说,让我们赶紧开始吧!!! IDEA的奇淫巧技 前言 奇淫巧技是第一生产力 -鲁迅 玩笑归玩笑,掌握IDEA的常用功能,不仅能提高开发效 ...

  7. 奇淫巧技的KMP算法--详解

    奇淫巧技的KMP算法–详解 花了一下午时间,看了十几个博客,终于拿下了KMP高地,现在总结下下自己对KMP的理解和实现. 情景1 假如你是一名生物学家,现在,你的面前有两段 DNA 序列 S 和 T, ...

  8. 源码解析中看到的奇淫巧技

    源码解析中看到的奇淫巧技 一. 数组重置 let arr = [123,123] arr.length // 2 arr.length = 0 arr // [] 当我们给数组的length 属性设置 ...

  9. [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject

    特别提醒:本文编写时间是 2013 年,请根据目前 .NET 发展接收你所需的知识点. 为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特 ...

最新文章

  1. 20155328 《信息安全系统设计基础》第六周 课堂提交补充
  2. C#之windows桌面软件第七课:(下集)串口工具实现数据校验、用灯反应设备状态
  3. 京东小程序上线,剑指何方?
  4. Processing 字体变形
  5. s5pv210——定时器理论与操作
  6. 所有XP_SP2服务的详细介绍
  7. IPSR(中断程序状态寄存器),IPSR包含了当前正在执行的中断服务程序编号,用于识别当前中断。
  8. php rsa加密乱码_PHP RSA密文过长加密解密 越过1024的解决代码
  9. 7. Simple Product
  10. 【设计模式】Iterator设计作业-设计LinkedList的iterator
  11. 忽略mysql库的同步
  12. php获取图片格式(图片后缀)
  13. 世界上最伟大最邪恶的软件发明
  14. cents7配置gradle4
  15. 2022科技公司薪酬排行榜,来了!
  16. 关于YouTub视频广告格式
  17. 关于web项目播放AMR格式音频的问题
  18. 链表操作eeeeeeeeee
  19. android平板提速,提升Android平板性能的十大技巧
  20. 有人离职时经理的反应是?

热门文章

  1. python运行调出控制台_python.exe 和 pythonw.exe 的区别
  2. 工业机器人 扬州 江都_扬州市14家企业获批2019年江苏省示范智能车间
  3. 元素不包括_干货 | FDA法规对元素杂质的限度控制及计算方法
  4. php服务划分,云计算提供的服务分为哪三个层次
  5. ssis mysql to server_SSIS:将表从MySQL复制到SQL Server 2008
  6. Mac安装RocketMQ和可视化控制台教程
  7. 开源:分享10 个让你笑的合不拢嘴的 GitHub 项目!
  8. 项目管理基础:软件开发的方法介绍
  9. 二进制编译安装mysql_数据库(MySQL)二进制安装+编译安装 + MariaDB编译安装
  10. javascript中interval与setTimeOut的区别