首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC ValueProvider 體系第二篇:DictionaryValueProvider、RouteDataValueProvider 與 HttpFileCollectionValueProvider

     編輯:關於ASP.NET

DictionaryValueProvider<TValue>:泛型字典值提供者

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>,鍵唯一。

RouteDataValueProvider:路由資料值提供者

public sealed class RouteDataValueProvider : DictionaryValueProvider<object>
{
    public RouteDataValueProvider(ControllerContext controllerContext)
        : base(controllerContext.RouteData.Values, CultureInfo.InvariantCulture) { }
}

直接包裝 RouteData.Values (RouteValueDictionary),提供路由參數(controller、action、id 等)繫結。

HttpFileCollectionValueProvider:上傳檔案值提供者

HTTP 檔案集合結構

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; }
}

Provider 實作

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 整合新型字典資料來源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved