ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Model绑定器的最基础的应用作个简单的示例展示,目的在于让大家事先了解一下Model绑定器是什么样的便于后续篇幅的理解。
IModelBinder、自定义Model绑定器简单实现
Model绑定器在MVC框架中的位置
MVC中的默认Model绑定器生成过程
IModelBinderProvider的简单应用
IValueProvider在MVC框架中生成的位置以及过程
IValueProvider的应用场景
IValueProvider的实现之NameValueCollectionValueProvider
Model绑定器在前面的篇幅示例中也有涉及到,在本篇中重新讲一下,看过前面篇幅的朋友可以大概的浏览一下本篇,然后跳至下一篇了。
对于Model绑定器系统提供了一个默认的绑定器DefaultModelBinder类型,而它实现了IModelBinder接口,我们来看一下IModelBinder接口的定义,代码1-1.
代码1-1
public interface IModelBinder { // 摘要: // 使用指定的控制器上下文和绑定上下文将模型绑定到一个值。 // // 参数: // controllerContext: // 控制器上下文。 // // bindingContext: // 绑定上下文。 // // 返回结果: // 绑定值。 object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext); }
看到代码1-1中,IModelBinder接口中定义了一个BindModel()方法,并且有两个参数,通过系统提供给我们的注释了解到,一个是控制器上下文对象,还有一个是绑定器上下文对象,控制器上下文对象的意思就是在当前控制器所执行范围内的所有基础信息都包含在其中,同理绑定上下文也是。后续的篇幅会对这一系列的上下文对象作详细的介绍,这里就带过了。
现在我们来实现IModelBinder接口定义个自己的Model绑定器,当然了也可以继承自DefaultModelBinder类型重写一下BindModel()方法。我们来看一下我们的自定义实现,代码1-2.
代码1-2
using System.Web.Mvc; using ConsoleApplication2; namespace MvcApplication.Binders { public class MyCustomModelBinder:IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { return new Customer() { CustomerID = "010", Name = "测试人员", RegistrationDate = DateTime.Now, Address = new Address() { AddressName = "天空之城" } }; } } }
对于ConsoleApplication2命名空间的引用是因为ViewModel被定义在了那里,也就是代码1-2中BindModel()方法所要返回的类型,在代码1-2中我们只是简单的实例化了一个ViewModel(Customer类型),实际可以做的操作非常多。我们再看一下ViewModel的定义,代码1-3。
代码1-3
public class Customer { [HiddenInput(DisplayValue=false)] public string CustomerID { get; set; } [Display(Name="姓名")] [UIHint("Password")] public string Name { get; set; } [DataType(DataType.Date)] [Display(Name="注册日期")] public DateTime RegistrationDate{ get; set; } [UIHint("Address")] public Address Address { get; set; } } public class Address { [Display(Name="地址名称")] [MyCustomMetadataAware] public string AddressName { get; set; } }
代码1-3就是ViewModel的定义了,其中包含的一些信息有不清楚的可以在看完本篇后去看ASP.NET MVC Model元数据系列。
现在我们看一下控制器方法的定义,代码1-4.
代码1-4
public ViewResult Show(Customer customer) { return View(customer); }
为什么ViewModel要以作为控制器方法参数的方式来进行Model绑定呢?这个疑问在下篇中会解决。
看一下代码1-5,作为Show方法对应视图的代码:
代码1-5
@model ConsoleApplication2.Customer @{ ViewBag.Title = "Show"; } <h2>Show</h2> <p>@Html.EditorForModel()</p> <p>@Html.EditorFor(m=>Model.Address)</p>
这样就完成了基础的工作了,不过还是运行不了,因为我们自定义的Model绑定器还没有定义到系统中,在项目的Global.asax文件中的MvcApplication类型的Application_Start()方法中添加如代码1-6。
代码1-6
ModelBinders.Binders.Add(typeof(Customer), new Binders.MyCustomModelBinder());
当然了也不限于在这里添加,只要在授权过滤器执行之前的任何一个地方都行,因为在授权过滤器执行过后便会对Model绑定器进行生成了,下篇会有讲解。在这里添加只不过这里是MVC最先执行的地方。现在我们运行查看结果了。
图1