zoukankan      html  css  js  c++  java
  • 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


    作者:金源

  • 相关阅读:
    Java静态类
    【Java TCP/IP Socket】深入剖析socket——TCP套接字的生命周期
    【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)
    【Java TCP/IP Socket】深入剖析socket——数据传输的底层实现
    【Java TCP/IP Socket】基于NIO的TCP通信(含代码)
    【Java TCP/IP Socket】Java NIO Socket VS 标准IO Socket
    【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)
    数据结构课后练习题(练习三)7-5 Tree Traversals Again (25 分)
    快速排序详解(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排源码)
    Java多线程(一)——线程基础和锁锁锁
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6745019.html
Copyright © 2011-2022 走看看