ASP.NET MVC Model绑定(六)

ASP.NET MVC Model绑定(六)

前言

前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框架中给我们提供了几种默认的实现类型,在本篇中将会对NameValueCollectionValueProvider类型做一个示例讲解,了解一下MVC框架给我们提供的值提供程序是怎么处理Model值的。

Model绑定

  • IModelBinder、自定义Model绑定器简单实现
  • Model绑定器在MVC框架中的位置
  • MVC中的默认Model绑定器生成过程
  • IModelBinderProvider的简单应用
  • IValueProvider在MVC框架中生成的位置以及过程
  • IValueProvider的应用场景
  • IValueProvider的实现之NameValueCollectionValueProvider

IValueProvider的实现之NameValueCollectionValueProvider

前面的一篇中我们对IValueProvider的使用作了示例演示,那是一个从控制器方法到视图的一个绑定的过程,大家有没有想过在视图里的数据是怎么在绑定回控制器部分的。视图中的数据类型的不同对应的使用绑定的类型也不同,本篇就为大家示例一个自定义类型的绑定。

代码1-1

public class Customer
    {
        [HiddenInput(DisplayValue=true)]
        public string CustomerID { get; set; }

        [Display(Name="姓名")]
        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-1中的类型已经出现过很多次了,但是出于对没看过前面篇幅的朋友负责的态度也要加上阿,这是下面示例要用到的示例ViewModel。

首先我们需要数据展示:

代码1-2:

    public class ValueProviderCaseController : Controller
    {
        public ViewResult Show(Customer customer)
        {
            return View(customer);
        }

    }

代码1-2中定义了个Show()方法,参数类型为代码1-1所示类型。

看下Show()方法对应的视图,当然了这样创建的是强类型视图,代码1-3.

代码1-3

@model ConsoleApplication2.Customer
@{
    ViewBag.Title = "Show";
}
<h2>
    Show</h2>
@using (Html.BeginForm("Update", "ValueProviderCase"))
{
    <p>@Html.EditorForModel()</p>
    <p>@Html.EditorFor(m => Model.Address)</p>
    <br />
    <input type="submit" value="提交" />
}

在代码1-3中,我们也看到了,使用了BeginForm()视图辅助器,并且令表单指向ValueProviderCase 控制器的Update()方法,这个后面会说到,暂且带过。现在这个时候我们还运行不了项目,我们需要为代码1-2中的Show()配置一个Model绑定器,代码1-4.

代码1-4

 public class MyCustomModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {

            if (controllerContext.HttpContext.Request.RequestType == "GET")
            {
                return new Customer()
                {
                    CustomerID = "010",
                    Name = "测试人员",
                    RegistrationDate = DateTime.Now,
                    Address = new Address()
                    {
                        AddressName = "天空之城"
                    }
                };
            }
            return null;
        }
    }

从代码1-4中,我们可以看到对Model绑定器做了控制,使它在请求类型为Get的时候返回代码1-1所示类型的ViewModel实例。因为后面的示例我们也还会用到这个Model绑定器,所以加了控制。对于Model绑定器的注册这里就不说了,运行结果如图1.

图1

如果这个时候我们单击提交按钮会把数据会变成什么样子呢?数据到了当前系统上下文中。

NameValueCollection

为什么要讲到NameValueCollection类型呢,因为NameValueCollectionValueProvider类型中的操作就是针对的NameValueCollection类型的,这里我们来看图1中点击提交后的的数据展示如图2

图2

说好了数据呢?大家别急,图2中的是NameValueCollection类型的AllKeys属性中的值,而NameValueCollection类型的实例是通过controllerContext.HttpContext.Request.Form这样获取而来,也就是上面说到的点击“提交”后所形成的数据类型。而我们的NameValueCollectionValueProvider类型则是对NameValueCollection类型的处理,具体的内部处理细节就不在这详细描述了。

下面我们需要做提交后的操作,就是显示到更新界面,那我们得按照上面代码1-3中的定义的那样,需要个Update()方法,示例代码1-5.

代码1-5

    public class ValueProviderCaseController : Controller
    {

        public ViewResult Show(Customer customer)
        {
            return View(customer);
        }
        [HttpPost]
        public ActionResult Update(Customer customer)
        {
            return View(customer);
        }

    }

这个时候我们是看不到绑定器内部的实现的,所以我们来模拟一下,修改上面代码1-4中的内容,如示例代码1-6.

代码1-6

public class MyCustomModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {

            if (controllerContext.HttpContext.Request.RequestType == "GET")
            {
                return new Customer()
                {
                    CustomerID = "010",
                    Name = "测试人员",
                    RegistrationDate = DateTime.Now,
                    Address = new Address()
                    {
                        AddressName = "天空之城"
                    }
                };
            }
            else if (controllerContext.HttpContext.Request.RequestType == "POST")
            {

                Customer customer = new Customer();
                customer.Address = new Address();
                NameValueCollection nameValueCollection =
                    controllerContext.HttpContext.Request.Form;
                NameValueCollectionValueProvider nameValueCollectionValueProvider =
                    new NameValueCollectionValueProvider(
                        nameValueCollection,
                        System.Globalization.CultureInfo.InstalledUICulture);
                customer.CustomerID = GetValue(nameValueCollectionValueProvider, "CustomerID");
                customer.Name = GetValue(nameValueCollectionValueProvider, "Name");
                customer.RegistrationDate = DateTime.Parse(GetValue(nameValueCollectionValueProvider, "RegistrationDate"));
                customer.Address.AddressName = GetValue(nameValueCollectionValueProvider, "Address.AddressName");
                return customer;

            }
            return null;
        }

        private string GetValue(IValueProvider valueProvider, string preFix)
        {
            return valueProvider.ContainsPrefix(preFix) ? valueProvider.GetValue(preFix).AttemptedValue : null;
        }
    }

这里忘了说了,可以把NameValueCollection类型想象成一个键值队类型的集合,并且NameValueCollection类型的实例已经包含着所有数据了,可以使用它内部的GetValue方法(并非代码1-6中的GetValue方法)来获取所对应的值,在NameValueCollectionValueProvider类型内部也是使用的这个方法来获取的值。

在代码1-6中我们对Model绑定器修改了太多了,首先是控制器了在请求类型为POST的时候(也就是为了在请求Update()方法时所用)使用这个Model绑定器,随之我们实例化了一个代码1-1中所示的ViewModel实例,后面会对它进行赋值,随后我们通过上下文获取到表单中的数据(NameValueCollection类型的实例)作为NameValueCollectionValueProvider类型构造函数的参数,我们还在Model绑定器中定义了个私有的GetValue()方法,这个的用途就是根据执行的前缀(NameValueCollection类型中的键值,也就是视图元素中的Name属性)从NameValueCollectionValueProvider类型的实例中获取对应的数据。

现在看一下Update()方法所对应的视图代码,示例代码1-7

@model ConsoleApplication2.Customer
@{
    ViewBag.Title = "Update";
}
<h2>
    Update</h2>
<p>@Html.EditorForModel()</p>
<p>@Html.EditorFor(m => Model.Address)</p>

这个时候我们可以运行项目,首先看到Show页面后,修改其中的值,然后提交过后会看到修改的值已经更新到了Update的界面中。

作者:金源

出处:http://blog.csdn.net/jinyuan0829

本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC Model绑定(六),布布扣,bubuko.com

时间: 2024-10-17 03:48:33

ASP.NET MVC Model绑定(六)的相关文章

ASP.NET MVC Model绑定(二)

ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程是什么样的?将在本篇为大家解除这些疑惑,在其中涉及到的一些描述类型和上下文参数会在后续的篇幅中讲到. Model绑定 IModelBinder.自定义Model绑定器简单实现 Model绑定器在MVC框架中的位置 MVC中的默认Model绑定器生成过程 IModelBinderProvider的简单

ASP.NET MVC Model绑定(五)

ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本篇你将会对IValueProvider有个更清晰的印象. Model绑定 IModelBinder.自定义Model绑定器简单实现 Model绑定器在MVC框架中的位置 MVC中的默认Model绑定器生成过程 IModelBinderProvider的简单应用 IValueProvider在MVC框

ASP.NET MVC Model绑定(一)

ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Model绑定器的最基础的应用作个简单的示例展示,目的在于让大家事先了解一下Model绑定器是什么样的便于后续篇幅的理解. Model绑定 IModelBinder.自定义Model绑定器简单实现 Model绑定器在MVC框架中的位置 MVC中的默认Model绑定器生成过程 IModelBinderPr

ASP.NET MVC Model绑定(四)

ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容器,为什么这么说呢?留个疑问在这里. 首先控制器的方法参数可能是很多种类型的.可能是多个同一种类型的,应对这种情况MVC框架使用的绑定实现都是IValueProvider来做的,而针对参数类型的不同等等一些情况,IValueProvider的实现类型也是有很大的差异的,这些具体实现的讲解会在后续的篇

ASP.NET MVC Model绑定(三)

ASP.NET MVC Model绑定(三) 前言 看过前两篇的朋友想必对Model绑定有个大概的了解,然而MVC框架给我们提供了更高的可扩展性的提供程序编程模式,也就是本篇的主题了,会讲解一下Model绑定器提供程序的实现以及解决一下上篇遗留的问题. 第一个问题是ModelBinderProviderCollection类型的执行过程? 还有个本篇的问题就是同样的向系统上下文中注册Model绑定器和Model绑定器提供程序,哪一个优先级更高? Model绑定 IModelBinder.自定义M

ASP.NET MVC Model绑定小结

Model绑定是指从URL提取数据,生成对应Action方法的参数这个过程.前面介绍的一系列Descriptor负责提供了控制器,行为方法和参数的元数据,ValueProvieder负责获取数据,剩下的Moder绑定则是利用上述两者的结果来最终达到Model的生成.ParameterDescriptor里面的BindingInfo(类型是ParameterBindingInfo)的Binder是一个实现了IModelBinder接口的对象,ModelBinder组件用于真正的Model绑定. M

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

Model绑定是 MVC 框架根据 HTTP 请求数据创建 .NET 对象的一个过程. 一.简单类型 1.单一值 获取值 二.多个值 获取值 三.数组 获取值 二.复杂类型 一.简单类型与数组组合 获取值 二.简单类型与集合 localhost:1234/ModelBinder?name=emrys&age=25&friends[0].name=lilei&friends[0].age=22&friends[1].name=hanmeimei&friends[1].

ASP.NET MVC Model验证(二)

ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决 这个问题的,并且会描述一下ModelValidator类型对象相关的类型. Model验证 Model验证简单运用示例 ModelValidator使用生成过程 自定义实现DefaultModelBinder进行验证 自定义ModelValidatorProvider 和ModelValidator  Validation

[转] ASP.NET MVC 模型绑定的功能和问题

摘要:本文将与你深入探究 ASP.NET MVC 模型绑定子系统的核心部分,展示模型绑定框架的每一层并提供扩展模型绑定逻辑以满足应用程序需求的各种方法. 同时,你还会看到一些经常被忽视的模型绑定技术,并了解如何避免一些最常见的模型绑定错误. ASP.NET MVC 模型绑定通过引入自动填充控制器操作参数的抽象层.处理通常与使用 ASP.NET 请求数据有关的普通属性映射和类型转换代码来简化控制器操作. 虽然模型绑定看起来很简单,但实际上是一个相对较复杂的框架,由许多共同创建和填充控制器操作所需对