public abstract class ValueProviderFactory
{
public abstract IValueProvider GetValueProvider(ControllerContext controllerContext);
}
| Factory | 建立的 ValueProvider | 資料來源 |
|---|---|---|
| ChildActionValueProviderFactory | ChildActionValueProvider | 父 Action 的 ViewData/ViewBag |
| FormValueProviderFactory | FormValueProvider | POST 表單資料 (Request.Form) |
| JsonValueProviderFactory | DictionaryValueProvider<object> | JSON 要求本文 (Request.InputStream) |
| RouteDataValueProviderFactory | RouteDataValueProvider | 路由資料 (RouteData.Values) |
| QueryStringValueProviderFactory | QueryStringValueProvider | 查詢字串 (Request.QueryString) |
| HttpFileCollectionValueProviderFactory | HttpFileCollectionValueProvider | 上傳檔案 (Request.Files) |
public static class ValueProviderFactories
{
public static ValueProviderFactoryCollection Factories { get; }
}
public class ValueProviderFactoryCollection : Collection<ValueProviderFactory>
{
public IValueProvider GetValueProvider(ControllerContext controllerContext)
{
var providers = new List<IValueProvider>();
foreach (var factory in this)
providers.Add(factory.GetValueProvider(controllerContext));
return new ValueProviderCollection(providers);
}
}
優先級規則:集合中越前面的 Provider 產生的 ValueProvider 越優先被 ValueProviderCollection 查詢。同名鍵存在於表單與查詢字串時,表單值勝出。
public class CookieValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
var cookies = controllerContext.HttpContext.Request.Cookies;
var dict = cookies.AllKeys.ToDictionary(k => k, k => (object)cookies[k].Value);
return new DictionaryValueProvider<object>(dict, CultureInfo.InvariantCulture);
}
}
// 註冊於 Global.asax
ValueProviderFactories.Factories.Add(new CookieValueProviderFactory());
// 或插入特定位置調整優先級
ValueProviderFactories.Factories.Insert(2, new CookieValueProviderFactory());

ContainsPrefix, GetValue)。ValueProvider 體系採工廠模式分離建構與使用,六大內建 Factory 涵蓋主流資料來源。自訂 Factory 可輕鬆擴充新資料來源(Cookie、Header、Session 等),透過集合順序控制優先級,完美符合開放封閉原則。