从元数据中提取错误验证消息
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<T>()
返回 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;
【讨论】:
以上是关于从元数据中提取错误验证消息的主要内容,如果未能解决你的问题,请参考以下文章