看過前兩篇的朋友想必對Model綁定有個大概的了解,然而MVC框架給我們提供了更高的可擴展性的提供程序編程模式,也就是本篇的主題了,會講解一下Model綁定器提供程序的實現(xiàn)以及解決一下上篇遺留的問題。
創(chuàng)新互聯(lián)建站成立與2013年,先為許昌等服務(wù)建站,許昌等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為許昌企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。第一個問題是ModelBinderProviderCollection類型的執(zhí)行過程?
還有個本篇的問題就是同樣的向系統(tǒng)上下文中注冊Model綁定器和Model綁定器提供程序,哪一個優(yōu)先級更高?
IModelBinder、自定義Model綁定器簡單實現(xiàn)
Model綁定器在MVC框架中的位置
MVC中的默認(rèn)Model綁定器生成過程
IModelBinderProvider的簡單應(yīng)用
IValueProvider在MVC框架中生成的位置以及過程
IValueProvider的應(yīng)用場景
IValueProvider的實現(xiàn)之NameValueCollectionValueProvider
首先我們先看一下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綁定器。現(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)用定義在當(dā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當(dāng)中就是我定義的當(dāng)前系統(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框架進(jìn)行了一個最基礎(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綁定(一)篇幅中的一樣,所以這里就沒有列舉了。
在此我們根據(jù)上篇中最后圖2所示的那樣,可以判斷出ModelBinderProviderCollection類型的執(zhí)行過程是根據(jù)當(dāng)前ParameterDescriptor類型所提供的Model類型對比我們注冊到或者是系統(tǒng)默認(rèn)提供的Model綁定器提供程序集合,如果有是針對ParameterDescriptor類型所提供的Model類型(上述示例中是Customer類型)則會有Model綁定器的返回,然后再根據(jù)Model綁定器進(jìn)行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
看到圖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)用場景需求。
當(dāng)前標(biāo)題:ASP.NETMVCModel綁定(三)-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://vcdvsql.cn/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)
猜你還喜歡下面的內(nèi)容