在自定义ModelBinder中提取数据注释

时间:2013-11-20 12:01:05

标签: c# asp.net-mvc data-annotations

我在MVC中使用自定义模型绑定器来实现System.Web.Mvc.IModelBinder。

模型绑定器采用泛型类型(类)提取每个类属性,并将它们存储在List中,并附加有关每个属性的其他详细信息。例如,对于每个Property,它根据登录用户存储每个属性的访问权限,即Read,Write,None。然后在我的视图中,我使用这些附加数据来确定是否显示特定属性。

我希望能够检索每个属性的验证数据注释属性,并存储这些详细信息。我想将它们存储为html属性,我可以将其注入到用于稍后显示属性的控件中,如下例所示。

<input data-val="true" data-val-length="Address1&#32;must&#32;be&#32;less&#32;than&#32;8!!" data-val-length-max="8" data-val-required="Address&#32;Line&#32;1&#32;is&#32;required." id="Entity_Address_AddressLine1" name="Entity.Address.AddressLine1" type="text" value="aaaa1111" />

我是否必须使用反射从类中提取数据注释属性,还是有另一种方法?如何将数据注释输出为html属性?

2 个答案:

答案 0 :(得分:1)

你走了:

foreach (PropertyInfo prop in Model.GetType().GetProperties())
{
    var annotations = prop.GetCustomAttributes(typeof(ValidationAttribute), false);
    foreach(var annotation in annotations)
    {
        if(annotation is RequiredAttribute)
        {
            //...
        }
    }
}

答案 1 :(得分:0)

为此,我实现了我在MVC中注册和使用的自定义DataAnnotationsModelMetadataProvider(MpMetaDataProvider)。 您在Global.asax的Application_Start事件中注册它

ModelMetadataProviders.Current = new MpMetaDataProvider();

在我的MpMetaDataProvider中,我调用以下方法返回特定类的特定属性的数据注释。我希望这有助于某人。

this.GetMetadataForProperty(modelAccessor, modelProperty.Parent.EntityType, modelProperty.Name);