如果我有以下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
变量?
答案 0 :(得分:0)
要访问代码注释属性,必须使用反射:
var attribute = type.GetCustomAttribute<RequiredAttribute>();
var isRequired = attribute != null;
命名空间:
System.Reflection
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;
}