MVC模型绑定

摘要:
DOCTYPE html˃678910索引111213//如果没有复杂类型,您也可以使用此14//varjsonData={15//Id:1,16/Name:“Li-Si”17//};18//$.邮递21varparamsUrl=“Id=1&Name=Li Si&Address。City=Guangzhou&Address.Country=China&Roles[0]。Name=Administrator&Roles[1]。Name=Section Chief&Roles[2]。Name=Curator”;22$. 邮递252627!

在项目中使用MVC的时候,我们无需像WebForm那样手动获取值再赋值到Model上,这得益于MVC的模型绑定,下面就介绍下复杂类型的模型绑定

Controller:

1     public classHomeController : Controller
2 {
3 [HttpGet]
4         publicActionResult Index()
5 {
6             returnView();
7 }
8 
9 [HttpPost]
10         publicActionResult Index(Person person)
11 {
12             returnJson(person);
13 }
14     }

Model:

1     public classPerson
2 {
3         public int Id { get; set; }
4         public string Name { get; set; }
5         public Address Address { get; set; }
6         public List<Role> Roles { get; set; }
7 }
8 
9     public classAddress
10 {
11         public string Country { get; set; }
12         public string City { get; set; }
13 }
14 
15     public classRole
16 {
17         public string Name { get; set; }
18     }

View:

1 @{
2 Layout = null;
3 }
4 
5 <!DOCTYPE html>
6 
7 <html>
8 <head>
9     <meta name="viewport"content="width=device-width" />
10     <title>Index</title>
11     <script src="~/Scripts/jquery-1.8.2.min.js"></script>
12     <script type="text/javascript">
13         //如果没有复杂类型,也可以使用这种
14         //var jsonData = {
15         //Id: 1,
16         //Name: "李四"
17         //};
18         //$.post("/home/index", jsonData, function (data) {
19         //console.log(data);
20         //});
21         varparamsUrl = "Id=1&Name=李四&Address.City=广州&Address.Country=中国&Roles[0].Name=管理员&Roles[1].Name=科长&Roles[2].Name=馆长";
22 $.post("/home/index", paramsUrl, function(data) {
23 console.log(data);
24 });
25     </script>
26 </head>
27 <body>
28     <div>
29 
30     </div>
31 </body>
32 </html>

发送请求 post参数:

MVC模型绑定第1张

返回:

MVC模型绑定第2张

在MVC5(5.2.3.0)之前我们需要拼接成这种参数后台Index(Person person)才能接收到对应值,但是MVC5(5.2.3.0)版本的时候可以直接传递Json对象

升级为MVC5.2.3.0后,只需改视图即可:

1 @{
2 Layout = null;
3 }
4 
5 <!DOCTYPE html>
6 
7 <html>
8 <head>
9     <meta name="viewport"content="width=device-width" />
10     <title>Index</title>
11     <script src="~/Scripts/jquery-1.8.2.min.js"></script>
12     <script type="text/javascript">
13         varjsonData ={
14 Id: 1,
15 Name: "李四",
16 Address: { City: "广州", Country: "中国"},
17 Roles: [{ Name: "管理员"}, { Name: "科长"}, { Name: "馆长"}]
18 };
19 $.post("/home/index", jsonData, function(data) {
20 console.log(data);
21 });
22     </script>
23 </head>
24 <body>
25     <div>
26 
27     </div>
28 </body>
29 </html>

发送请求post参数,这里会将url转码:

MVC模型绑定第3张

解码后【MVC5(5.2.3.0)之前不能接收 Address[City]=广州 这种方式的传值】:

MVC模型绑定第4张

返回(跟之前返回一样):

MVC模型绑定第5张

另外还可以使用Bind特性来决定需要绑定哪些属性

1 [HttpPost]
2         public ActionResult Index([Bind(Include = "Name,Age")]Person per)
3 {
4             returnJson(per);
5         }

[Bind(Include = "Name,Age")] 表示只绑定Person对象中的Name和Age属性,其他属性则为默认值

[Bind(Exclude = "Name,Age")] 这个表示不绑定Person对象中的Name和Age属性

也可以直接在Model加上BindAttribute来决定绑定和不绑定哪些属性

1     [Bind(Include="Name,Age")]
2     public classPerson
3 {
4         public int Id { get; set; }
5         public string Name { get; set; }
6         public int Age { get; set; }
7     }

Bind还有一个参数是Prefix,这个是用来指定前缀,具体看下面例子

Model:

1     public classPerson
2 {
3         public int Id { get; set; }
4         public string Name { get; set; }
5         public int Age { get; set; }
6         public Address Address1 { get; set; }
7     }

View:

1         <form action="/home/index"method="post">
2 @Html.TextBoxFor(p => p.Address1.City)
3 @Html.TextBoxFor(p => p.Address1.Country)
4             <input type="submit"value="提交" />
5         </form>

Action:

1 [HttpPost]
2         publicActionResult Index(Address address)
3 {
4             returnJson(address);
5         }

提交的内容:MVC模型绑定第6张

返回:MVC模型绑定第7张

如果在不使用Prefix的情况下我们是获取不到提交的值的,使用Prefix:

1 [HttpPost]
2         public ActionResult Index([Bind(Prefix = "Address1")]Address address)
3 {
4             returnJson(address);
5         }

加上[Bind(Prefix = "Address1")]:MVC模型绑定第8张

灵活运用将会在开发过程中如鱼得水,哈哈

免责声明:文章转载自《MVC模型绑定》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇OptimalSolution(5)--数组和矩阵问题(1)简单Linux使用netstat命令查看并发连接数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Java读取图片和EXIF信息

后台需要读取客户端上传的图像//上传图像的宽度intoriginalheight=originalImg。获取高度();无论是在Windows中直接查看上述代码还是图像,都会获得宽度大于高度的信息。使用上述代码,可以直接读取宽度和高度。该值不考虑图像翻转方向,而是读取图像的EXIF信息。...

Ubuntu下安装Latex [转]

Ubuntu下LaTex中文环境配置LaTeX是一个强大的排版软件,但是其最初只是为英文排版而设计的。第一步,安装基本的LaTeX环境:sudoapt-getinstalltexlive第二步,安装中文字体包。sudoapt-getinstalllatex-cjk-all至此,基本的配置就完成了。正常情况下,编译这个tex文件就能在文档中显示中文了。\doc...

泛微E8升级E9代码修改

E8升级E9需要修改后台二次开发的代码,总工作量相当大。CheckCustomize=function(){varnodeId=$.val();//应用程序节点如果{varpgrcontrol=$.val);varfinishpercent=$.vl();如果{如果{Dialog.alert(“进度控制为yes,需要完成百分比!”);return false...

收集vcftools所有用法

VCFtools用来处理VCF文档。vcftools--vcftest.vcflesstest.vcf|vcftools--vcf-Applyingafilter可以把筛选的突变写入一个新文件。--recode表示输出筛选的内容,--recode-INFO-all保留所有的INFOfields的内容。default情况下,INFOfields不写,因为筛选会...

element-ui表格el-table回显时默认全选数据

1、html代码˂el-table-columntype="selection"width="45"...

antd Tabs组件动态加载组件内容

Tabs的TabPane子组件不支持将属性传递给Component,并且官方示例的TabPane内容仅为简单文本。...