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

Controller:

     public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
return View();
} [HttpPost]
public ActionResult Index(Person person)
{
return Json(person);
}
}

Model:

     public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
public List<Role> Roles { get; set; }
} public class Address
{
public string Country { get; set; }
public string City { get; set; }
} public class Role
{
public string Name { get; set; }
}

View:

 @{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
//如果没有复杂类型,也可以使用这种
//var jsonData = {
// Id: 1,
// Name: "李四"
//};
//$.post("/home/index", jsonData, function (data) {
// console.log(data);
//});
var paramsUrl = "Id=1&Name=李四&Address.City=广州&Address.Country=中国&Roles[0].Name=管理员&Roles[1].Name=科长&Roles[2].Name=馆长";
$.post("/home/index", paramsUrl, function (data) {
console.log(data);
});
</script>
</head>
<body>
<div> </div>
</body>
</html>

发送请求 post参数:

返回:

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

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

 @{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
var jsonData = {
Id: 1,
Name: "李四",
Address: { City: "广州", Country: "中国" },
Roles: [{ Name: "管理员" }, { Name: "科长" }, { Name: "馆长" }]
};
$.post("/home/index", jsonData, function (data) {
console.log(data);
});
</script>
</head>
<body>
<div> </div>
</body>
</html>

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

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

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

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

         [HttpPost]
public ActionResult Index([Bind(Include = "Name,Age")]Person per)
{
return Json(per);
}

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

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

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

     [Bind(Include="Name,Age")]
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}

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

Model:

     public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public Address Address1 { get; set; }
}

View:

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

Action:

         [HttpPost]
public ActionResult Index(Address address)
{
return Json(address);
}

提交的内容:

返回:

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

         [HttpPost]
public ActionResult Index([Bind(Prefix = "Address1")]Address address)
{
return Json(address);
}

加上[Bind(Prefix = "Address1")]:

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

MVC模型绑定的更多相关文章

  1. ASP.NET MVC模型绑定的6个建议(转载)

    ASP.NET MVC模型绑定的6个建议 发表于2011-08-03 10:25| 来源博客园| 31 条评论| 作者冠军 validationasp.netmvc.netasp 摘要:ASP.NET ...

  2. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

  3. ASP.NET没有魔法——ASP.NET MVC 模型绑定

    在My Blog中已经有了文章管理功能,可以发布和修改文章,但是对于文章内容来说,这里缺少最重要的排版功能,如果没有排版的博客很大程度上是无法阅读的,由于文章是通过浏览器查看的,所以文章的排版其实与网 ...

  4. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)

    上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...

  5. asp.net Mvc 模型绑定项目过多会导致页面运行时间卡

    asp.net Mvc 模型绑定项目过多会导致页面运行时间卡的问题. 解决方式就是采用ModelView方式进行精简,已减少模型绑定及验证的时间.

  6. [转] ASP.NET MVC 模型绑定的功能和问题

    摘要:本文将与你深入探究 ASP.NET MVC 模型绑定子系统的核心部分,展示模型绑定框架的每一层并提供扩展模型绑定逻辑以满足应用程序需求的各种方法. 同时,你还会看到一些经常被忽视的模型绑定技术, ...

  7. .net core mvc 模型绑定 之 json and urlencoded

    .net core mvc 模型绑定, FromQuery,对应 url 中的 urlencoded string ("?key1=value1&key2=value2") ...

  8. ASP.NET MVC——模型绑定

    这篇文章我们来讲讲模型绑定(Model Binding),其实在初步了解ASP.NET MVC之后,大家可能都会产生一个疑问,为什么URL片段最后会转换为例如int型或者其他类型的参数呢?这里就不得不 ...

  9. MVC 模型绑定

    在WebForm,获取提交表单的值一般都是Request.Form["Title"]这样的方式.在MVC中,提供了模型绑定机制.让后台获取表单或Url中的参数变得更加简单. 一.基 ...

  10. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)

    前面文章介绍了ASP.NET MVC中的模型绑定和验证功能,本着ASP.NET MVC没有魔法的精神,本章内容将从代码的角度对ASP.NET MVC如何完成模型的绑定和验证进行分析,已了解其原理. 本 ...

随机推荐

  1. 数组中键key相等时,后面的值覆盖前面的值

    <?php $arr[]='abc'; $arr[]='; $arr[]='; $arr[]='; var_dump($arr); 结果;

  2. Linux 项目实用命令

    总结一下Linux下常用的命令 nc nc命令,这是Linux一般都带有的,被誉为“瑞士军刀”.windows和Linux都有,可以下载安装对应的平台工具.使用UDP和TCP协议的网络连接去读写数据, ...

  3. Struts2监听Action结果的监听器

    作者:禅楼望月 在前面我们学到了在特定的Action中配置结果监听器,在Action完成控制处理之后,struts2转入实际的物理视图之前被回调.但是这种方式的缺点是,结果的监听器不能被复用.根据设计 ...

  4. dp类模板

    1.n串最长公共子序列 #include<cstdio> #include<cstring> #include<algorithm> using namespace ...

  5. [洛谷P4838]P哥破解密码

    题目大意:求长度为$n$的$01$串中,没有连续至少$3$个$1$的串的个数 题解:令$a_1$为结尾一个$1$的串个数,$a_2$为结尾两个$1$的串的个数,$b$为结尾是$0$的串的个数.$a_1 ...

  6. MySQL触发器写法

    触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/dele ...

  7. HDU1151:Air Raid(最小边覆盖)

    Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. Codeforces Round #478 C. Valhalla Siege

    C. Valhalla Siege time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  9. 注意@Bean中的initMethod和destroyMethod

    @Configuration public class AppConfig { @Bean(initMethod = "init") public Foo foo() { retu ...

  10. Kafka自我学习1-Multi-broker cluster

    ====================================Testing environment =========================================== ...