日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC Model绑定(四)

發(fā)布時(shí)間:2025/1/21 asp.net 108 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC Model绑定(四) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ASP.NET MVC Model綁定(四)

前言

前面的篇幅對(duì)于Model綁定器IModelBinder以及實(shí)現(xiàn)類(lèi)型、Model綁定器提供程序都作了粗略的講解,可以把Model綁定器想象成一個(gè)大的容器,為什么這么說(shuō)呢?留個(gè)疑問(wèn)在這里。

首先控制器的方法參數(shù)可能是很多種類(lèi)型的、可能是多個(gè)同一種類(lèi)型的,應(yīng)對(duì)這種情況MVC框架使用的綁定實(shí)現(xiàn)都是IValueProvider來(lái)做的,而針對(duì)參數(shù)類(lèi)型的不同等等一些情況,IValueProvider的實(shí)現(xiàn)類(lèi)型也是有很大的差異的,這些具體實(shí)現(xiàn)的講解會(huì)在后續(xù)的篇幅中講解。

都說(shuō)旁觀者清,我們不要走進(jìn)MVC框架,站在外面看。本篇會(huì)已站在外面的角度去對(duì)IValueProvider做個(gè)描述。

?

Model綁定

  • IModelBinder、自定義Model綁定器簡(jiǎn)單實(shí)現(xiàn)
  • Model綁定器在MVC框架中的位置
  • MVC中的默認(rèn)Model綁定器生成過(guò)程
  • IModelBinderProvider的簡(jiǎn)單應(yīng)用
  • IValueProvider在MVC框架中生成的位置以及過(guò)程
  • IValueProvider的應(yīng)用場(chǎng)景
  • IValueProvider的實(shí)現(xiàn)之NameValueCollectionValueProvider

?

IValueProvider在MVC框架中生成的位置以及過(guò)程

生成的位置

大家可否記得在ASP.NET MVC Model綁定(二)中對(duì)于Model綁定器生成位置的描述,這里借用一下那副描述生成位置的示意圖,

圖1

圖1中所示,藍(lán)色線條執(zhí)行流程中,在Model綁定器生成后,即會(huì)生成IValueProvider類(lèi)型,說(shuō)是生成有點(diǎn)不妥,改成獲取吧。為什么這樣說(shuō)在下面的生成部分會(huì)講到

?

生成的過(guò)程

我們先看一下圖1中藍(lán)色線條流程的實(shí)現(xiàn)代碼。

代碼1-1

protected virtual object GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor){Type parameterType = parameterDescriptor.ParameterType;IModelBinder modelBinder = this.GetModelBinder(parameterDescriptor);IValueProvider valueProvider = controllerContext.Controller.ValueProvider;string str = parameterDescriptor.BindingInfo.Prefix ?? parameterDescriptor.ParameterName;Predicate<string> propertyFilter = GetPropertyFilter(parameterDescriptor);ModelBindingContext context2 = new ModelBindingContext{FallbackToEmptyPrefix = parameterDescriptor.BindingInfo.Prefix == null,ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, parameterType),ModelName = str,ModelState = controllerContext.Controller.ViewData.ModelState,PropertyFilter = propertyFilter,ValueProvider = valueProvider};ModelBindingContext bindingContext = context2;return (modelBinder.BindModel(controllerContext, bindingContext) ?? parameterDescriptor.DefaultValue);}

對(duì)于代碼1-1中所示的方法,不用去管的它的返回類(lèi)型以及這個(gè)方法的作用,我們現(xiàn)在想知道的就是IValueProvider是怎么來(lái)的!!!

從代碼1-1中,我們可以明確的看到在生成Model綁定器過(guò)后,MVC框架從ControllerContext控制器上下文參數(shù)對(duì)象中獲得了當(dāng)前請(qǐng)求所請(qǐng)求的控制器的引用,然后根據(jù)當(dāng)前的控制器對(duì)象引用獲取到IValueProvider類(lèi)型。

然后MVC框架會(huì)實(shí)例化ModelBindingContext類(lèi)型,并且把剛剛獲取的IValueProvider類(lèi)型賦值到其中的ValueProvider屬性上。

對(duì)于ModelBindingContext類(lèi)型,Model綁定上下文對(duì)象,看下它的定義代碼1-2。

代碼1-2

public class ModelBindingContext{public ModelBindingContext();public ModelBindingContext(ModelBindingContext bindingContext);public bool FallbackToEmptyPrefix { get; set; }public object Model { get; set; }public ModelMetadata ModelMetadata { get; set; }public string ModelName { get; set; }public ModelStateDictionary ModelState { get; set; }public Type ModelType { get; set; }public Predicate<string> PropertyFilter { get; set; }public IDictionary<string, ModelMetadata> PropertyMetadata { get; }//// 摘要:// 獲取或設(shè)置值提供程序。//// 返回結(jié)果:// 值提供程序。public IValueProvider ValueProvider { get; set; }}

這里我們只需初步的了解ModelBindingContext類(lèi)型就行了,回到主題中,上面說(shuō)到從當(dāng)前控制器對(duì)象的引用中直接獲取的,那我們就去看一下控制器中的ValueProvider屬性。我們就來(lái)看一下Controller類(lèi)型,代碼1-3.

代碼1-3

public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter {…… }

跟大家開(kāi)了個(gè)玩笑,緩解下氣氛。Controller類(lèi)型中并沒(méi)有我們所要找的屬性,有的朋友想到了,對(duì)的是在基類(lèi)類(lèi)型中的,確實(shí)是在ControllerBase類(lèi)型中的(代碼1-4)。

代碼1-4

public abstract class ControllerBase : IController {……public IValueProvider ValueProvider { get; set; } }

難道我們?cè)谑褂肐ValueProvider的時(shí)候是要賦值到控制器對(duì)象上的嗎?

當(dāng)然不是了,我們看一下代碼1-4中ValueProvider屬性的實(shí)現(xiàn),示例代碼1-5.

代碼1-5

public IValueProvider ValueProvider{get{if (this._valueProvider == null){this._valueProvider = ValueProviderFactories.Factories.GetValueProvider(this.ControllerContext);}return this._valueProvider;}set{this._valueProvider = value;}}

看到這里想必大家就應(yīng)該已經(jīng)了解了IValueProvider類(lèi)型的由來(lái)了,是從系統(tǒng)的ValueProviderFactories類(lèi)型的Factories屬性中來(lái)根據(jù)當(dāng)前控制器上下文獲取到的。

這里我們看一下生成IValueProvider類(lèi)型的幾個(gè)相關(guān)類(lèi)型的定義,示例代碼1-6。

代碼1-6

public static class ValueProviderFactories{// 摘要:// 獲取應(yīng)用程序的值提供程序工廠的集合。//// 返回結(jié)果:// 值提供程序工廠對(duì)象的集合。public static ValueProviderFactoryCollection Factories { get; }}
public class ValueProviderFactoryCollection : Collection<ValueProviderFactory>{public ValueProviderFactoryCollection();public ValueProviderFactoryCollection(IList<ValueProviderFactory> list);// 摘要:// 為指定控制器上下文返回值提供程序工廠。//// 參數(shù):// controllerContext:// 一個(gè)對(duì)象,該對(duì)象封裝有關(guān)當(dāng)前 HTTP 請(qǐng)求的信息。//// 返回結(jié)果:// 用于指定控制器上下文的值提供程序工廠對(duì)象。public IValueProvider GetValueProvider(ControllerContext controllerContext);protected override void InsertItem(int index, ValueProviderFactory item);protected override void SetItem(int index, ValueProviderFactory item);} public abstract class ValueProviderFactory{protected ValueProviderFactory();// 摘要:// 為指定控制器上下文返回值提供程序?qū)ο蟆?/span>//// 參數(shù):// controllerContext:// 一個(gè)對(duì)象,該對(duì)象封裝有關(guān)當(dāng)前 HTTP 請(qǐng)求的信息。//// 返回結(jié)果:// 值提供程序?qū)ο蟆?/span>public abstract IValueProvider GetValueProvider(ControllerContext controllerContext);}

ValueProviderFactories類(lèi)型的這種模式前面見(jiàn)過(guò)太多了,就不說(shuō)了,它里面包含著ValueProviderFactoryCollection類(lèi)型的靜態(tài)屬性,而ValueProviderFactoryCollection類(lèi)型又是ValueProviderFactory類(lèi)型的集合類(lèi)型,所以在最終生成IValueProvider類(lèi)型的時(shí)候也是先遍歷ValueProviderFactoryCollection類(lèi)型,獲取每個(gè)ValueProviderFactory類(lèi)型的實(shí)例并且來(lái)生成IValueProvider類(lèi)型,這里也是最先匹配而不是最優(yōu)匹配。

這里捎帶一句,可以用控制器上下文對(duì)象來(lái)對(duì)ValueProviderFactory類(lèi)型中的生成邏輯進(jìn)行分類(lèi),針對(duì)不同的控制器生成不同的IValueProvider類(lèi)型。對(duì)于IValueProvider類(lèi)型的使用后面篇幅會(huì)有說(shuō)明。

?

?

作者:金源

出處:http://www.cnblogs.com/jin-yuan/

本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面

轉(zhuǎn)載于:https://www.cnblogs.com/jin-yuan/p/3819206.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET MVC Model绑定(四)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。