【问题标题】: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 变量?

【问题讨论】:

    标签: c# asp.net-mvc razor model-view-controller


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-27
      • 1970-01-01
      • 2022-01-25
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多