从元数据

时间:2016-04-14 14:01:10

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

如果我有以下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变量?

2 个答案:

答案 0 :(得分:0)

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

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

命名空间:

  • GetCustomAttribute() - System.Reflection
  • RequiredAttribute - System.ComponentModel.DataAnnotations

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

如果GetCustomAttribute<T>()返回null,则表示该属性没有类型T的属性。因为您正在查看RequiredAttribute是否存在,这意味着如果该属性不为null,则需要该属性。

答案 1 :(得分:0)

您可以使用

获取属性的所有验证错误消息
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;
}