ASP.NET MVC Model绑定(一)

简介:

ASP.NET MVC Model绑定(一)

前言

ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Model绑定器的最基础的应用作个简单的示例展示,目的在于让大家事先了解一下Model绑定器是什么样的便于后续篇幅的理解。

 

Model绑定

  • IModelBinder、自定义Model绑定器简单实现

  • Model绑定器在MVC框架中的位置

  • MVC中的默认Model绑定器生成过程

  • IModelBinderProvider的简单应用

  • IValueProvider在MVC框架中生成的位置以及过程

  • IValueProvider的应用场景

  • IValueProvider的实现之NameValueCollectionValueProvider

IModelBinder、自定义Model绑定器简单实现

Model绑定器在前面的篇幅示例中也有涉及到,在本篇中重新讲一下,看过前面篇幅的朋友可以大概的浏览一下本篇,然后跳至下一篇了。

对于Model绑定器系统提供了一个默认的绑定器DefaultModelBinder类型,而它实现了IModelBinder接口,我们来看一下IModelBinder接口的定义,代码1-1.

代码1-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  interface  IModelBinder
     {
         // 摘要:
         //     使用指定的控制器上下文和绑定上下文将模型绑定到一个值。
         //
         // 参数:
         //   controllerContext:
         //     控制器上下文。
         //
         //   bindingContext:
         //     绑定上下文。
         //
         // 返回结果:
         //     绑定值。
         object  BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);
     }

看到代码1-1中,IModelBinder接口中定义了一个BindModel()方法,并且有两个参数,通过系统提供给我们的注释了解到,一个是控制器上下文对象,还有一个是绑定器上下文对象,控制器上下文对象的意思就是在当前控制器所执行范围内的所有基础信息都包含在其中,同理绑定上下文也是。后续的篇幅会对这一系列的上下文对象作详细的介绍,这里就带过了。

现在我们来实现IModelBinder接口定义个自己的Model绑定器,当然了也可以继承自DefaultModelBinder类型重写一下BindModel()方法。我们来看一下我们的自定义实现,代码1-2.

代码1-2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

1
2
3
4
         public  ViewResult Show(Customer customer)
         {
             return  View(customer);
         }

为什么ViewModel要以作为控制器方法参数的方式来进行Model绑定呢?这个疑问在下篇中会解决。

看一下代码1-5,作为Show方法对应视图的代码:

代码1-5

1
2
3
4
5
6
7
@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

1
ModelBinders.Binders.Add( typeof (Customer),  new  Binders.MyCustomModelBinder());

当然了也不限于在这里添加,只要在授权过滤器执行之前的任何一个地方都行,因为在授权过滤器执行过后便会对Model绑定器进行生成了,下篇会有讲解。在这里添加只不过这里是MVC最先执行的地方。现在我们运行查看结果了。

图1




     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1431401,如需转载请自行联系原作者




相关文章
|
7天前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
20 7
|
5天前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
16 0
|
29天前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
29 0
|
30天前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
前端开发 数据安全/隐私保护
net MVC中的模型绑定、验证以及ModelState
net MVC中的模型绑定、验证以及ModelState 模型绑定 模型绑定应该很容易理解,就是传递过来的数据,创建对应的model并把数据赋予model的属性,这样model的字段就有值了。
1681 0
|
1月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
79 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
145 0
|
4月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
63 0
|
4月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
253 5
|
4月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界