ASP.NETMVCModel綁定(三)-創(chuàng)新互聯(lián)

ASP.NET MVC Model綁定(三)

前言

看過前兩篇的朋友想必對Model綁定有個大概的了解,然而MVC框架給我們提供了更高的可擴展性的提供程序編程模式,也就是本篇的主題了,會講解一下Model綁定器提供程序的實現(xiàn)以及解決一下上篇遺留的問題。

創(chuàng)新互聯(lián)建站成立與2013年,先為許昌等服務(wù)建站,許昌等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為許昌企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

第一個問題是ModelBinderProviderCollection類型的執(zhí)行過程?

還有個本篇的問題就是同樣的向系統(tǒng)上下文中注冊Model綁定器和Model綁定器提供程序,哪一個優(yōu)先級更高?

Model綁定

  • IModelBinder、自定義Model綁定器簡單實現(xiàn)

  • Model綁定器在MVC框架中的位置

  • MVC中的默認Model綁定器生成過程

  • IModelBinderProvider的簡單應(yīng)用

  • IValueProvider在MVC框架中生成的位置以及過程

  • IValueProvider的應(yīng)用場景

  • IValueProvider的實現(xiàn)之NameValueCollectionValueProvider

IModelBinderProvider的簡單應(yīng)用

首先我們先看一下IModelBinderProvider類型的定義,代碼1-1:。

代碼1-1

    public interface IModelBinderProvider
    {
        // 摘要:
        //     返回指定類型的模型聯(lián)編程序。
        //
        // 參數(shù):
        //   modelType:
        //     模型的類型。
        //
        // 返回結(jié)果:
        //     指定類型的模型聯(lián)編程序。
        IModelBinder GetBinder(Type modelType);
    }

在代碼1-1中我們看出,其中的GetBinder()方法是根據(jù)ViewModel的類型來做一些操作,最后返回Model綁定器?,F(xiàn)在我們自定義實現(xiàn)一個Model綁定器提供程序代碼1-2。

代碼1-2

using System.Web.Mvc;
using ConsoleApplication2;

namespace MvcApplication.Infrastructure
{
    public class MyCustomModelBinderProvider : IModelBinderProvider
    {
        public IModelBinder GetBinder(Type modelType)
        {
            if (modelType == null)
            {
                throw new ArgumentNullException("modelType");
            }
            if (modelType == typeof(Customer))
            {
               //返回對應(yīng)Customer類型的Model綁定器
            }
            return null;
        }
    }
}

在代碼1-2中我們根據(jù)modelType判斷是否是Customer類型,然后返回對應(yīng)Customer類型的Model綁定器。為什么這里的實現(xiàn)是空的,因為我想把我們前面講解過的IoC框架用起來,讓Model綁定器提供程序跟Model綁定器解除耦合,想把IoC框架的應(yīng)用定義在當前系統(tǒng)的上下文中,我們看一下代碼實現(xiàn),代碼1-3。

代碼1-3

namespace MvcApplication
{
    public class MVCSystemContext
    {
        private static MVCSystemContext _MVCSystemContext;

        public static MVCSystemContext Context
        {
            get
            {
                if (_MVCSystemContext == null)
                {
                    _MVCSystemContext = new MVCSystemContext();
                }
                return _MVCSystemContext;
            }
        }

        private ServiceContainer _serviceContainer;

        private MVCSystemContext()
        {
            _serviceContainer = new ServiceContainer();
            _serviceContainer.AddService(typeof(NinjectController),NinjectController.Instance);
        }

        public NinjectController NinjectController
        {
            get
            {
                return (NinjectController)_serviceContainer.GetService(typeof(NinjectController));
            }
        }


    }
}

代碼1-3當中就是我定義的當前系統(tǒng)上下文了,只不過這個是給自己用的,上下文對象中想必是不會把所用到的所有數(shù)據(jù)或者是功能都添加在里面的,只是添加個引用而已,如代碼1-3中的NinjectController屬性,NinjectController屬性對應(yīng)的類型就是NinjectController類型,NinjectController類型的作用就是提供IoC框架的功能,我們看一下代碼1-4中對于NinjectController類型的定義。

代碼1-4

using Ninject;

namespace MvcApplication.Infrastructure.NinjectControllerPart
{
    public class NinjectController
    {
        private static NinjectController _Instance;

        public static NinjectController Instance
        {
            get 
            {
                return _Instance = new NinjectController();
            }
        }

        private IKernel _ninjectKernel;

        private NinjectController()
        {
            _ninjectKernel = new StandardKernel();
        }

        public void AddKernelBind<T, U>()where U:T
        {
            _ninjectKernel.Bind<T>().To<U>();
        }

        public T GetValueType<T>(Type keyType)
        {
            var valueType = _ninjectKernel.Get(keyType);
            return (T)valueType;
        }
    }
}

其中對于Ninject這個IoC框架進行了一個最基礎(chǔ)的功能封裝,有的朋友可能會問為什么不公開個一個屬性,何必這樣多此一舉,因為我對Ninject的使用也不是很熟練,對于這部分的封裝我只是讓其簡單的公開了兩個功能,一個是綁定一個是獲取值,這樣讓這部分內(nèi)容還在我的可控范圍內(nèi),如果是公開屬性的話,其他人的胡亂使用導(dǎo)致錯誤的話是不可控的。

切回主題,這樣基礎(chǔ)定義好了過后,我們再修改1-2中的代碼,把具體實現(xiàn)給加上,示例代碼1-5所示。

代碼1-5

if (modelType == typeof(Customer))
{
    //返回對應(yīng)Customer類型的Model綁定器
    return MVCSystemContext.Context.NinjectController.GetValueType<IModelBinder>(typeof(IModelBinder));
}

可以看到代碼1-5中,根據(jù)我們自定義上下文中的提供的IoC功能獲取到綁定在IoC框架中的值,那么綁定又是在哪里呢?跟ASP.NET MVC Model綁定(一)所演示的那樣,還是在項目的Global.asax文件中的MvcApplication類型的Application_Start()方法中添加如代碼1-6。

代碼1-6

MVCSystemContext.Context.NinjectController.AddKernelBind<IModelBinder, Binders.MyCustomModelBinder>();
ModelBinderProviders.BinderProviders.Add(new MyCustomModelBinderProvider());

代碼1-6分別做了兩個操作,先是把對應(yīng)Customer類型的Model綁定器注冊到了我們自定義上下文的IoC中,然后再把針對處理Customer類型的Model綁定器提供程序注冊到系統(tǒng)中。運行結(jié)果如圖1.

圖1

ASP.NET MVC Model綁定(三)

其中涉及到所有部分的代碼和ASP.NET MVC Model綁定(一)篇幅中的一樣,所以這里就沒有列舉了。

在此我們根據(jù)上篇中最后圖2所示的那樣,可以判斷出ModelBinderProviderCollection類型的執(zhí)行過程是根據(jù)當前ParameterDescriptor類型所提供的Model類型對比我們注冊到或者是系統(tǒng)默認提供的Model綁定器提供程序集合,如果有是針對ParameterDescriptor類型所提供的Model類型(上述示例中是Customer類型)則會有Model綁定器的返回,然后再根據(jù)Model綁定器進行Model綁定。

好了現(xiàn)在第一個問題解決了,來解決第二個問題。來看代碼1-7所示。

代碼1-7

public class MyCustomModelBinder:IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            return new Customer()
            {
                CustomerID = "010",
                Name = "測試人員",
                RegistrationDate = DateTime.Now,
                Address = new Address()
                {
                    AddressName = "天空之城"
                }
            };
        }
    }

    public class MyCustomModelBinder_Test : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            return new Customer()
            {
                CustomerID = "010",
                Name = "測試人員",
                RegistrationDate = DateTime.Now,
                Address = new Address()
                {
                    AddressName = "這里是根據(jù)Model綁定器綁定執(zhí)行的Model"
                }
            };
        }
    }

看到代碼1-7中的MyCustomModelBinder_Test 類型內(nèi)部Customer類型實例內(nèi)部的AddressName值已經(jīng)更改的和之前的不一樣了。再看一***冊端的修改,示例代碼1-8。

代碼1-8

ModelBinders.Binders.Add(typeof(Customer), new Binders.MyCustomModelBinder_Test());
MVCSystemContext.Context.NinjectController.AddKernelBind<IModelBinder, Binders.MyCustomModelBinder>();
ModelBinderProviders.BinderProviders.Add(new MyCustomModelBinderProvider());

代碼1-8中,我們把新定義的MyCustomModelBinder_Test 類型注冊到了系統(tǒng)的Model綁定器集合中,看一下究竟是哪一個級別更高一點。

來看運行結(jié)果圖2

圖2

ASP.NET MVC Model綁定(三)

看到圖2這個結(jié)果,想必已經(jīng)知道了是哪個級別更高一點了。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當前標題:ASP.NETMVCModel綁定(三)-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://www.bm7419.com/article24/cdjjce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、定制網(wǎng)站品牌網(wǎng)站建設(shè)、搜索引擎優(yōu)化、商城網(wǎng)站、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)