在ASP.NET MVC 中视图与模型是可以直接绑定的,这样就绕过了Controller。这种应用场景主要是做信息的提交,比如用户的注册,订单的提交等等。在蒋金楠的《ASP.NET MVC 5框架揭秘》中,他提出MVC视图与模型直接绑定容易带来“混乱”,建议在开发过程中对视图,模型及控制器的交互做好约定,或者使用MVP模式。MVP模式杜绝了视图与模型的直接交互,从根本上解决这个问题。今天我写了一个小例子,来看看视图与模型是如何直接绑定的及绑定的意义。
项目结构如上图所示,Models层单独抽出来,目前只有两个类,Product和User类,目前没有模型校验,因为不是这个章节的重点。
public ActionResult Index()
{
return View();
}
[HttpPost]
public string Index(User user)
{
return "Thank you :" + user.Name;
}
控制器中的两个方法,一个是初次访问VIEW的时候用的,另一个是POST方法使用的。VIEW页面代码如下:
@model MyMvcApp.Models.User
@{
Layout = null;
}
@using(Html.BeginForm("Index","Home",FormMethod.Post))
{
<p>Your name :@Html.TextBoxFor(x=>x.Name)</p>
<p>Your email:@Html.TextBoxFor(x => x.Email)</p>
<p>Your phone:@Html.TextBoxFor(x => x.Phone)</p>
<p>Your gender:@Html.DropDownListFor(x=>x.Gender,new[]{
new SelectListItem(){ Text = "I am a boy.", Value = "male", Selected = true },
new SelectListItem(){ Text = "I am a girl.", Value = "female", Selected = false }},"please select your gender")</p>
<p><input type="submit" value="submit your information" /></p>
}
可以发现这里引用model的方式比MVC2简单明了,@标签使用起来也更加清爽。MVC3在这方面确实比MVC2有很大的提高。效果如下:
这是信息提交界面,这里的输入框已经和模型进行了绑定,模型绑定最大的好处是可以使用模型校验,比如字段长度等等。在表单提交的时候,直接提交一个对象到后台进行处理,而不必再提交界面上的各个字段,简化了处理流程。
后台的这个方法接受到了一个对象,这样就不必再一个一个去获取。当然也可以那样来做。
Model与View的绑定还有另外一种形式的绑定,比如视图要展示一个列表的时候,这时候就需要绑定一个模型的集合,通常我们以IEnumerable<T>的形式来绑定。
我们的Product类如下:
namespace MyMvcApp.Models
{
public class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
}
}
控制器里面可以这样写:
public ActionResult ProductDisplay()
{
List<Product> listProduct = new List<Product>();
listProduct.Add(new Product() { ProductID = 1, ProductName = "产品001" });
listProduct.Add(new Product() { ProductID = 2, ProductName = "产品002" });
listProduct.Add(new Product() { ProductID = 3, ProductName = "产品003" });
ViewData.Model = listProduct;
return View();
}
控制器里面拿到数据的过程通常被抽提成一个业务逻辑层,这里为了演示不去写那么复杂。在VIEW层我们循环获取model的属性就可以了、
@model IEnumerable<MyMvcApp.Models.Product>
@{
Layout = null;
}
<table border="2">
<tr><td colspan="2">Product List</td></tr>
@foreach (var item in @Model)
{
<tr>
<td>@item.ProductID</td>
<td>@item.ProductName</td>
</tr>
}
</table>
注意这里的模型是一个可迭代的集合,因为我们展示的是一个列表。展示到界面上就是下面这个样子的。
关于模型与视图绑定这一个章节就介绍到这里。