在前面的介绍中我们已经提到过表示Model元数据的ModelMetadata对象最终是通过一个名为ModelMetadataProvider的组件提供的,接下来我们着重讨论基于ModelMetadataProvider 中] 一、 ModelMetadataProvider 在ASP.NET MVC的Model元数据相关的应用编程接口中,用于创建Model元数据的ModelMetadataProvider接继承自抽象类 ModelMetadataProvider。 如下面的代码片断所示,ModelMetadataProviders具有一个ModelMetadataProvider类型的静态可读可写属性Current用于获取和设置当前使用的ModelMetadataProvider ,后者是ModelMetadataProvider的子类。
public class Validator : IObjectModelValidator { public Validator(IModelMetadataProvider modelMetadataProvider ) { ModelMetadataProvider = modelMetadataProvider; } public IModelMetadataProvider ModelMetadataProvider { get; } public void Validate(ActionContext actionContext, ValidationStateDictionary model) { //var data=ModelMetadataProvider.GetMetadataForType(model.GetType()); //
propertyBinderFactory = ControllerBinderDelegateProvider.CreateBinderDelegate(_parameterBinder,_modelBinderFactory,_modelMetadataProvider ParameterBinder parameterBinder,IModelBinderFactory modelBinderFactory, IModelMetadataProvider modelMetadataProvider mvcOptions) { //各种验证 略 var parameterBindingInfo = GetParameterBindingInfo(modelBinderFactory, modelMetadataProvider actionDescriptor, mvcOptions); var propertyBindingInfo = GetPropertyBindingInfo(modelBinderFactory, modelMetadataProvider BinderItem[] GetParameterBindingInfo(IModelBinderFactory modelBinderFactory,IModelMetadataProvider modelMetadataProvider
12: public virtual Dictionary<string, object> AdditionalValues { get; } 13: protected ModelMetadataProvider public string Name { get; } 8: public object Value { get;} 9: } ModelMetadata的属性Provider是一个ModelMetadataProvider 对象,顾名思义,ModelMetadataProvider是ModelProvider的提供者。
MyExceptionFilterAttribute : ExceptionFilterAttribute { private readonly IModelMetadataProvider _modelMetadataProvider ; public MyExceptionFilterAttribute(IModelMetadataProvider modelMetadataProvider) { _modelMetadataProvider = modelMetadataProvider; } public override void OnException(ExceptionContext { ViewName = "Error", ViewData = new ViewDataDictionary(_modelMetadataProvider
这两段是要被放到框架内部去完成的,这里只是为了演示其元数据的设置原理,所以简单这么写; System.Web.Mvc.ModelMetadataProvider 实现自定义元数据提供程序: 1 using MvcApplication4.Seed 6 { 7 public class CustomModelMetadataProviderWithConfig : System.Web.Mvc.ModelMetadataProvider
自定义模型元数据提供程序:我们可以实现自己的模型元数据提供程序,继承ModelMetadataProvider类,并覆盖GetMetadataForProperty和GetMetadataForType
我们知道ASP.NET MVC大都采用Provider的模式来提供相应的组件,比如描述Model元数据的ModelMetadata通过对应的ModelMetadataProvider来提供,实现Model
在Action方法Index中,我们使用当前的ModelMetadataProvider创建了基于Contact类型的ModelMetadata,然后调用ModelValidator的静态方法GetValidator
base(parameter) { match = match; } public override Task ExecuteBindingAsync( ModelMetadataProvider
: base(parameter) { _match = match; } public override Task ExecuteBindingAsync(ModelMetadataProvider
) { _match = match; } public override Task ExecuteBindingAsync(ModelMetadataProvider
static ModelMetadata GetModelMetadata<TModel>(string propertyName) 2: { 3: ModelMetadataProvider
ControllerBinderDelegateProvider.CreateBinderDelegate( 23 _parameterBinder, 24 _modelBinderFactory, 25 _modelMetadataProvider