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

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

作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC Model绑定的更多相关文章
- ASP.NET MVC Model绑定(六)
ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框 ...
- ASP.NET MVC Model绑定(五)
ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...
- ASP.NET MVC Model绑定(四)
ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...
- ASP.NET MVC Model绑定(三)
ASP.NET MVC Model绑定(三) 前言 看过前两篇的朋友想必对Model绑定有个大概的了解,然而MVC框架给我们提供了更高的可扩展性的提供程序编程模式,也就是本篇的主题了,会讲解一下Mod ...
- ASP.NET MVC Model绑定(二)
ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...
- ASP.NET MVC Model绑定(一)
ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...
- ModelBinder——ASP.NET MVC Model绑定的核心
ModelBinder——ASP.NET MVC Model绑定的核心 Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过 ...
- ASP.NET MVC Model绑定小结
Model绑定是指从URL提取数据,生成对应Action方法的参数这个过程.前面介绍的一系列Descriptor负责提供了控制器,行为方法和参数的元数据,ValueProvieder负责获取数据,剩下 ...
- ASP.NET MVC Model绑定的简单应用
Model绑定是 MVC 框架根据 HTTP 请求数据创建 .NET 对象的一个过程. 一.简单类型 1.单一值
随机推荐
- poj2593 Max Sequence(两个不相交字段的最大总和与)
转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=2593">http://poj.org/prob ...
- C++ Web Programming
一般的网关接口或者CGI,就是一个标准的集合.它定义信息怎样再问吧server和一般脚本间的交换. CGI的说明书是由NCSA维护,NCSA定义CGI的范畴:一般的网关接口或者CGI是外部网关程序的一 ...
- DirectSound应用
只是使用的假设PlaySound()这个API函数来显示的声音效果,然后,然后,它不会出现在混合声音,因为PlaySound还有播放期间声音,这将不可避免地导致现有声音停止. 因此,使用 PlaySo ...
- js手机对应的多级导航分享
js移动导航对应,您可以使用自适应时屏幕,当小画面在一定程度上的网站.使导航出现,The navigation effects such as the following figures:多级导航! ...
- 高性能网络server--I/O复 select poll epoll_wait之间的差
一个.select 方式作为收集,最多只能监控1024描述叙事断裂的文件,内部使用位操作,相应的位置1或设置0,必须是可读.可写.三类除单独的事件,内部查询方法.将全部的套接字从内核到用户空间之间进行 ...
- C#实现对mongoDB的简单增删查改
首先添加所需要驱动包(可通过nuget获得) using MongoDB.Bson;using MongoDB.Driver;using MongoDB.Driver.Builders; 一.设置配置 ...
- 多维算法思考(三):AB组合问题
多维算法思考(三):AB组合问题 题目:x个A,y个B可以组合成多少个不同排列的问题. 首先,我们用数学的方式思考,这个问题属于<组合数学>的问题,我们的第一种方法可以用组合思路来求解. ...
- 从头开始学JavaScript (四)——操作符
原文:从头开始学JavaScript (四)--操作符 一.一元操作符 1.自增自减操作符:分为前置型和后置型: 前置型:++a;--a; 后置型:a++;a--; 例: <script typ ...
- Swift-开发 # 1.2版本迁移
{ Parallels: 可以将一个win程序拖到mac中运行. } --类似于虚拟机 遇到的几大问题: 1.自动修改无效? --忽略它的存在,坑. 2.无止境的修改,还是错? --使用替换工具-&g ...
- 【百度地图API】如何区分地址解析和智能搜索?
原文:[百度地图API]如何区分地址解析和智能搜索? 摘要: 很多用户一直无法区分地址解析geocoder和智能搜索localsearch的使用场景.该文章用一个详尽的示例,充分展示了这两个类,共5种 ...