DictionaryValueProvider
NameValueCollectionValueProvider采用一个NameValueCollection作为数据源,DictionnaryValueProvider的数据源类型自然就是一个Dictionnary。NameValueCollection和Dictionnary都是一个键值对的集合,它们之间的不同之处在NameValueCollection运行元素具有相同的Key,Dictionnary却要求元素的Key具有唯一性。
一、DictionaryValueProvider<TValue>
DictionnaryValueProvider的类型全名为System.Web.Mvc.DictionaryValueProvider<TValue>,如下面的代码片断所示,DictionaryValueProvider<TValue>实现了IEnumerableValueProvider和IValueProvider接口,构造函数接受一个IDictionary<string, TValue>对象,该对象表示作为数据源的字典。定义在DictionaryValueProvider<TValue>中所有方法的逻辑与定义在NameValueCollectionValueProvider中的同名方法并没有本质区别。
1: public class DictionaryValueProvider<TValue> : IEnumerableValueProvider, IValueProvider 2: { 3: public DictionaryValueProvider(IDictionary<string, TValue> dictionary, CultureInfo culture); 4: public virtual bool ContainsPrefix(string prefix); 5: public virtual IDictionary<string, string> GetKeysFromPrefix(string prefix); 6: public virtual ValueProviderResult GetValue(string key); 7: }
二、RouteDataValueProvider
将当前路由数据作为数据源的RouteDataValueProvider继承自DictionaryValueProvider<TValue>。如下面的代码片断所示,基于当前Controller上下文构建的RouteDataValueProvider直接将表示当前路由数据的RouteData对象的Values属性(这是一个RouteValueDictionary对象)作为数据来源。
1: public sealed class RouteDataValueProvider : DictionaryValueProvider<object> 2: { 3: public RouteDataValueProvider(ControllerContext controllerContext) : 4: base(controllerContext.RouteData.Values, CultureInfo.InvariantCulture) 5: { 6: } 7: }
三、HttpFileCollectionValueProvider
我们可以通过类型为file的输入元素进行文件的上传,在表示HTTP请求的HttpRequestBase对象中,上传文件通过只读属性Files表示。从下面的代码片断所示,该属性类型为HttpFileCollectionBase,是一个元素类型为HttpPostedFileBase的集合。
1: public abstract class HttpRequestBase 2: { 3: public virtual HttpFileCollectionBase Files { get; } 4: } 5: public abstract class HttpFileCollectionBase : NameObjectCollectionBase, ICollection, IEnumerable 6: { 7: public virtual string[] AllKeys { get; } 8: public override int Count { get; } 9: public virtual HttpPostedFileBase this[int index] { get; } 10: public virtual HttpPostedFileBase this[string name] { get; } 11: } 12: public abstract class HttpPostedFileBase 13: { 14: public virtual void SaveAs(string filename); 15: 16: public virtual int ContentLength { get; } 17: public virtual string ContentType { get; } 18: public virtual string FileName { get; } 19: public virtual Stream InputStream { get; } 20: }
用于处理上传文件的Action方法通常定义类型为HttpPostedFileBase及其列表的参数来表示上传的文件,针对HttpPostedFileBase参数的Model绑定选用的数据就来源于表示当前请求的HttpRequestBase的Files属性,而具体参数值的提供最终通过具有如下定义的HttpFileCollectionValueProvider来实现。
1: public sealed class HttpFileCollectionValueProvider : DictionaryValueProvider<HttpPostedFileBase[]> 2: { 3: public HttpFileCollectionValueProvider(ControllerContext controllerContext); 4: }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 类型
, 数据源
, public
, virtual
HttpPostedFileBase
,以便于您获取更多的相关知识。