ASP.NET MVC以ValueProvider為核心的值提供系統 一

來源:互聯網
上載者:User

NameValueCollectionValueProvider

在進行Model綁定過程中,需要根據基於Action方法參數的綁定上下文從請求資料中提取相應的資料以提供相應的資料。具體來說,Model繫結資料具有多個來源,可能來源於Post的表單或者JSON字串,或者來源於當前的路由資料,也可能來源於請求地址的插敘字串。ASP.NET MVC將這種基於不同資料來源的資料擷取/提供機制實現在一個叫做ValueProvider的組件中。

一、IValueProvider與ValueProviderResult

一般來講,一個ValueProvider採用的資料來源是一個字典類型的資料結構,我們通過它從這個字典中擷取一個Key與當前綁定上下文匹配的值。ValueProvider實現了具有如下定義的介面IValueProvider,GetValue方法根據指定的Key從資料來源中擷取對應的值對象,這個Key是基於當前綁定內容相關的。這個Key和存在於資料來源中對應資料條目的Key可能並非完全一致,後者可能在前者基礎上添加相應的首碼,而ContainsPrefix方法用於判斷資料來源字典的Key是否具有指定的首碼。

   1: public interface IValueProvider
2: {
3: bool ContainsPrefix(string prefix);
4: ValueProviderResult GetValue(string key);
5: }

IValueProvider的GetValue返回的是一個ValueProviderResult對象,我們可以將ValueProviderResult看成是對ValueProvider提供對象的封裝。如下面的代碼片斷所示,ValueProviderResult具有三個唯讀屬性,其中RawValue表示原始的值對象。而AttemptedValue表示以值對象的字串表示,該屬性主要用於顯示。

   1: [Serializable]
2: public class ValueProviderResult
3: {
4: public ValueProviderResult(object rawValue, string attemptedValue, CultureInfo culture);
5: public object ConvertTo(Type type);
6: public virtual object ConvertTo(Type type, CultureInfo culture);
7:
8: public string AttemptedValue { get; }
9: public CultureInfo Culture { get; }
10: public object RawValue { get; }
11: }

ValueProviderResult提供了兩個ConvertTo方法重載以實現向指定目標類型的轉換。某些類型的格式化行為依賴於相應的語言文化(比如時間、日期和貨幣等),而這個輔助格式湖的語言文化資訊通過Culture屬性工作表示。其中第一個ValueProviderResult方法重載通過屬性Culture表示的語言文化進行類型轉化。

二、NameValueCollectionValueProvider

前面已經說過,Model資料來源一般具有類似於字典的結構,而NameValueCollection可以表示為Key不具有唯一性的字典,將NameValueCollection對象作為資料來源的ValueProvider通過具有如下定義的NameValueCollectionValueProvider類型表示。表示資料來源的NameValueCollection對象在建構函式中指定,建構函式的另一個CultureInfo類型的參數表示服務於資料轉換的語言文化資訊。

   1: public class NameValueCollectionValueProvider : IUnvalidatedValueProvider, IEnumerableValueProvider, IValueProvider
2: {
3: //其他成員
4: public NameValueCollectionValueProvider(NameValueCollection collection, CultureInfo culture);
5:
6: public virtual bool ContainsPrefix(string prefix);
7: public virtual IDictionary<string, string> GetKeysFromPrefix(string prefix);
8: public virtual ValueProviderResult GetValue(string key);
9: public virtual ValueProviderResult GetValue(string key, bool skipValidation);
10: }
11: 
12: public interface IEnumerableValueProvider : IValueProvider
13: {
14: IDictionary<string, string> GetKeysFromPrefix(string prefix);
15: }
16: 
17: public interface IUnvalidatedValueProvider : IValueProvider
18: {
19: ValueProviderResult GetValue(string key, bool skipValidation);
20: }

從上面的代碼片斷我們可以看到,除了IValueProvider介面,NameValueCollectionValueProvider還實現了IEnumerableValueProvider和IUnvalidatedValueProvider兩個介面。顧名思義,IEnumerableValueProvider主要用於針對目標類型為集合的資料提供,方法GetKeysFromPrefix以一字典的形式返回具有指定首碼的Key。在預設的情況下,在進行資料提供的同時會對資料進行驗證,而IUnvalidatedValueProvider介面提供了一個額外的GetValue方法是我們可以忽略對資料的驗證。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.