【问题标题】:Extract Data Annotations in custom ModelBinder在自定义 ModelBinder 中提取数据注释
【发布时间】:2013-12-04 09:57:50
【问题描述】:

我在 MVC 中使用了一个自定义模型绑定器,它实现了 System.Web.Mvc.IModelBinder。

模型绑定器采用泛型类型(类)提取每个类属性并将它们与每个属性的其他详细信息一起存储在列表中。例如,对于每个属性,它根据登录用户存储每个属性的访问权限,即读取、写入、无。然后在我的视图中,我使用这些附加数据来确定是否显示特定属性。

我希望能够检索每个属性的验证数据注释属性并存储这些详细信息。我想将它们存储为 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 属性?

【问题讨论】:

  • 这可能会有所帮助...msdn.microsoft.com/en-us/library/…
  • 我不想创建一个新的验证属性,现有的很好但是由于我实现我的 ModelBinder 的方式,它们没有传递到编辑器模板视图。

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


【解决方案1】:

给你:

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

【讨论】:

  • 谢谢 DZL 我正在考虑这样做,但由于我如何实现我的 mvc 解决方案,这可能不适用。我倾向于使用自定义 DataAnnotationsModelMetadataProvider 将注释添加到属性的元数据中 - 不确定它是否适用于我的实现!
  • @gisWeeper 我很好奇这种差异如何使答案不适用。我正在考虑做类似的事情,并想确保我没有遗漏任何东西。也许您可以扩展您的问题?
【解决方案2】:

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

ModelMetadataProviders.Current = new MpMetaDataProvider();

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

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

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2018-01-24
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    相关资源
    最近更新 更多