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绑定的更多相关文章

  1. ASP.NET MVC Model绑定(六)

    ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框 ...

  2. ASP.NET MVC Model绑定(五)

    ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...

  3. ASP.NET MVC Model绑定(四)

    ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...

  4. ASP.NET MVC Model绑定(三)

    ASP.NET MVC Model绑定(三) 前言 看过前两篇的朋友想必对Model绑定有个大概的了解,然而MVC框架给我们提供了更高的可扩展性的提供程序编程模式,也就是本篇的主题了,会讲解一下Mod ...

  5. ASP.NET MVC Model绑定(二)

    ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...

  6. ASP.NET MVC Model绑定(一)

    ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...

  7. ModelBinder——ASP.NET MVC Model绑定的核心

    ModelBinder——ASP.NET MVC Model绑定的核心 Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数.通过前面的介绍我们知道Action方法的参数通过 ...

  8. ASP.NET MVC Model绑定小结

    Model绑定是指从URL提取数据,生成对应Action方法的参数这个过程.前面介绍的一系列Descriptor负责提供了控制器,行为方法和参数的元数据,ValueProvieder负责获取数据,剩下 ...

  9. ASP.NET MVC Model绑定的简单应用

    Model绑定是 MVC 框架根据 HTTP 请求数据创建 .NET 对象的一个过程. 一.简单类型 1.单一值

随机推荐

  1. linux内核包转发过程(三)NIC帧接收分析

    [版权声明:转载请保留源:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 每一个cpu都有队列来处理接收到的帧.都有其数据结构来处理入口和出口流量,因此.不同 ...

  2. wordpress常见的问题

    nginx如webserver,wordpress上传主题错误 413 Request Entity Too Large 解决: vim /usr/local/nginx/conf/nginx.con ...

  3. 面向对象三大特征之继承(extends)——Java笔记(六)

    继承:            从一般到特殊的关系,是一种拓展关系,子类对象是父类的一种,也可称为”is a“的关系 泛化:         把子类里的共性抽取到父类里的来的过程 特化:         ...

  4. PHP课程十大 PHP图像处理功能和实现的验证码

    假如你喜欢这个博客,访问这个博客地址:http://blog.csdn.net/junzaivip 总结: gd绘图库: 数学函数 PHP图片处理函数 图片处理函数使用场景 1.验证码 2.缩放 3. ...

  5. 大话设计模式C++达到-文章16章-国家模式

    一.UML画画 二.概念 状态模式(State):当一个对象的内在状态改变时同意改变其行为.这个对象看起来像是改变了其类. 三.说明 以下是来自书本和网络的对状态模式的定义和分析: (1)状态模式同意 ...

  6. Notification(一个)——使用演示样本的基础知识

    main.xml如下面: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

  7. iOS:Block写递归

    首先来一个 oc 的递归: - (int)sum:(int)num { ) { return num; } ]; } 写递归算法只需要记住两点即可: 1. 有一个明确的出口 2. 不满足条件出口时,自 ...

  8. Hibernate制图(两)——许多-于─关系映射

    上篇学习了Hibernate的基本映射,也就是单表映射,非常easy就能理解,可是对于关系数据库来说,表之间存在关系是比不可少的.关系数据库中存在的关系是通过主外键建立起来的.反应到Hibernate ...

  9. iOS开展 - 中国 iOS/Mac 开发博客列表

    博客地址 RSS地址 OneV's Den http://onevcat.com/atom.xml 破船之家 http://beyondvincent.com/atom.xml NSHipster h ...

  10. 防SQL注入:生成参数化的通用分页查询语句

    原文:防SQL注入:生成参数化的通用分页查询语句 前些时间看了玉开兄的“如此高效通用的分页存储过程是带有sql注入漏洞的”这篇文章,才突然想起某个项目也是使用了累似的通用分页存储过程.使用这种通用的存 ...