从元数据中提取错误验证消息

Posted

技术标签:

【中文标题】从元数据中提取错误验证消息【英文标题】:extract error validation message from metadata 【发布时间】:2016-08-06 03:32:36 【问题描述】:

如果我有以下 html 方法来呈现具有自定义属性的输入框,例如:

public class SomeClass

    [Required]
    public int Minutes  get; set; 


public static MvcHtmlString ToolTipTextBox<TModel, TValue>(this HtmlHelper<TModel> helper, 
                Expression<Func<TModel, TValue>> expression, object htmlAttributes)

    ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
    ...
    bool isRequired = metaData.IsRequired ? true : false;
    string validationMessage = ???

metaData 暴露给特定属性,我该如何提取它 来自数据注释属性的消息分钟字段是必需的。validationMessage 变量?

【问题讨论】:

【参考方案1】:

要访问代码注释属性,您必须使用反射:

var attribute = type.GetCustomAttribute<RequiredAttribute>();
var isRequired = attribute != null;

命名空间:

GetCustomAttribute() - System.Reflection 必需属性 - System.ComponentModel.DataAnnotations

要获取type,您需要从选择器中获取属性类型。如果你没有使用选择器,你可能会使用typeof(TModel).GetProperty("NameOfProperty") 之类的东西。如果要从选择器中提取属性名称,您仍然可以使用此方法。请注意,不能保证选择器返回属性(它可能是函数结果甚至是字段)。

如果 GetCustomAttribute&lt;T&gt;() 返回 null,则表示该属性没有 T 类型的属性。由于您要查看 RequiredAttribute 是否存在,这意味着如果属性不为空,则该属性是必需的。

【讨论】:

如果目标只是确定属性是否因其类型的性质或RequiredAttribute 注释而需要,他或她发布的代码似乎是正确的。但我相信他可以将您的答案与检查属性的ErrorMessageString 属性结合使用,以获取它将发出的错误消息。 哦,哎呀,我的疏忽大了哈哈。如果它仍然有帮助,我会留下我的答案,但是是的,我没有完全回答。【参考方案2】:

您可以使用

获取属性的所有验证错误消息
ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
string propertyName = ExpressionHelper.GetExpressionText(expression);
Func<string, ModelMetadata, IEnumerable<ModelClientValidationRule>> ruleFactory = (name, metadata) => ModelValidatorProviders.Providers
    .GetValidators(metadata, helper.ViewContext)
    .SelectMany(v => v.GetClientValidationRules());
IEnumerable<ModelClientValidationRule> rules = ruleFactory(propertyName, metaData);

并获取与RequiredAttribute关联的验证消息

ModelClientValidationRule requiredRule = rules.FirstOrDefault(r => r.ValidationType == "required");
if (requiredRule != null)

    string requiredMessage = requiredRule.ErrorMessage;

【讨论】:

以上是关于从元数据中提取错误验证消息的主要内容,如果未能解决你的问题,请参考以下文章

从元组中提取向量

BigtableConnection API 失败;从元数据服务器获取访问令牌时出错

JDBC:从元数据中获取数组的类型

从元数据中检索 MySQL 行创建的时间戳?

是否可以从元数据_property_中解码属性类

SQLAlchemy Asyncio ORM 在从元数据中检索表和列时无法查询数据库