public class DictionaryValueProvider<TValue> : IEnumerableValueProvider, IValueProvider
{
public DictionaryValueProvider(IDictionary<string, TValue> dictionary, CultureInfo culture);
public virtual bool ContainsPrefix(string prefix);
public virtual IDictionary<string, string> GetKeysFromPrefix(string prefix);
public virtual ValueProviderResult GetValue(string key);
}
與 NameValueCollectionValueProvider 邏輯相似,差異在資料來源為強型別 IDictionary<string, TValue>,鍵唯一。
public sealed class RouteDataValueProvider : DictionaryValueProvider<object>
{
public RouteDataValueProvider(ControllerContext controllerContext)
: base(controllerContext.RouteData.Values, CultureInfo.InvariantCulture) { }
}
直接包裝 RouteData.Values (RouteValueDictionary),提供路由參數(controller、action、id 等)繫結。
public abstract class HttpRequestBase
{
public virtual HttpFileCollectionBase Files { get; }
}
public abstract class HttpFileCollectionBase : NameObjectCollectionBase, ICollection, IEnumerable
{
public virtual string[] AllKeys { get; }
public virtual HttpPostedFileBase this[int index] { get; }
public virtual HttpPostedFileBase this[string name] { get; }
}
public abstract class HttpPostedFileBase
{
public virtual void SaveAs(string filename);
public virtual int ContentLength { get; }
public virtual string ContentType { get; }
public virtual string FileName { get; }
public virtual Stream InputStream { get; }
}
public sealed class HttpFileCollectionValueProvider : DictionaryValueProvider<HttpPostedFileBase[]>
{
public HttpFileCollectionValueProvider(ControllerContext controllerContext);
}
將 Request.Files 轉為 Dictionary<string, HttpPostedFileBase[]>,鍵為 input name,值為同名檔案陣列。支援多檔上傳繫結至 HttpPostedFileBase[] 或 IEnumerable<HttpPostedFileBase> 參數。
<input name="Avatar" type="file" />
<input name="Avatar" type="file" />
<input name="Documents" type="file" />
<input name="Documents" type="file" />
<input name="Documents" type="file" />
Action:
public ActionResult Upload(HttpPostedFileBase[] Avatar, List<HttpPostedFileBase> Documents) { ... }
Avatar 繫結 2 個檔案陣列,Documents 繫結 3 個檔案列表。
DictionaryValueProvider 為字典來源通用基類,RouteDataValueProvider 與 HttpFileCollectionValueProvider 分別包裝路由資料與上傳檔案。理解其繼承關係與資料轉換邏輯,可自訂 Provider 整合新型字典資料來源。