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. 编写高质量代码改善C#程序的157个建议[1-3]

    原文:编写高质量代码改善C#程序的157个建议[1-3] 前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理 ...

  2. RSA加密解密(PHP Demo)

    $private_key = '-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDpoODVtnSztGyb//p+g/Ob36jb3jzWzS2qovOj ...

  3. js 正则学习小记之NFA引擎

    原文:js 正则学习小记之NFA引擎 之前一直认为自己正则还不错,在看 次碳酸钴,Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣.  求抱大腿,求大神调教. 之前大致有个印象,正 ...

  4. 前端学习笔记(zepto或jquery)——对li标签的相关操作(四)

    对li标签的相关操作——五种方式给奇数项li标签设置样式 demo演示: 1 2 3 4 5 6 7 // 详解: 通常我们为多个li添加样式时常用的是使用filter,但我们在第三节中可以看到fil ...

  5. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 SharePoint中基于Web开发

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 SharePoint中基于Web开发         之前提到过, ...

  6. 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...

  7. 【百度地图API】如何调整结果面板的样式?如何获取指定页码的结果?

    原文:[百度地图API]如何调整结果面板的样式?如何获取指定页码的结果? 摘要: 1.你是否想自定义查询后,结果面板的显示样式? 2.数据接口每次只返回10条结果,如何取到单独每一页的结果? ---- ...

  8. POJ3342——Party at Hali-Bula

    Party at Hali-Bula Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5418   Accepted: 192 ...

  9. asp.net webform easyui

    建议使用   html 页面 和 一般处理程序,一般处理程序 继承 IRequiresSessionState  ,才能用 session .

  10. Asp.Net MVC5入门学习系列⑥

    原文:Asp.Net MVC5入门学习系列⑥ 接着上次的篇幅,我们这篇手动来写一个查询的流程代码! 搜索/查询 流程功能的实现 那现在要做搜索(查询)功能我们第一步应该做什么呢!第一次是不是我们应该去 ...