Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从元数据中提取错误验证消息_C#_Asp.net Mvc_Razor_Model View Controller - Fatal编程技术网

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

C# 从元数据中提取错误验证消息,c#,asp.net-mvc,razor,model-view-controller,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&l

如果我使用以下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 = ???
}
公共类SomeClass
{
[必需]
公共整数分钟数{get;set;}
}
公共静态MvcHtmlString TooliptextBox(此HtmlHelper帮助程序,
表达式、对象(属性)
{
ModelMetadata=ModelMetadata.FromLambdaExpression(表达式,helper.ViewData);
...
bool isRequired=metaData.isRequired?真:假;
字符串验证消息=???
}
为特定属性公开
元数据
,如何提取该属性
来自数据批注属性的消息分钟字段是必需的。对于
验证消息
变量?

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

var attribute = type.GetCustomAttribute<RequiredAttribute>();
var isRequired = attribute != null;
var attribute=type.GetCustomAttribute();
var isRequired=属性!=无效的
名称空间:

  • GetCustomAttribute()-
    System.Reflection
  • RequiredAttribute-
    System.ComponentModel.DataAnnotations
要获取
类型
,需要从选择器获取属性类型。如果您没有使用选择器,您可能会使用类似于
typeof(TModel).GetProperty(“NameOfProperty”)
的东西。如果要从选择器中提取属性的名称,仍然可以使用此方法。请注意,选择器不会返回属性(它可能是函数结果,甚至是字段)


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

您可以使用

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
注释而需要,那么他或她发布的代码似乎是正确的。但是我相信他可以将你的答案与检查属性的
ErrorMessageString
属性结合起来,得到它将发出的错误消息。哦,哎呀,我的疏忽太大了哈哈。我会留下我的答案,以防它仍然有用,但是的,我没有完全回答它。
ModelClientValidationRule requiredRule = rules.FirstOrDefault(r => r.ValidationType == "required");
if (requiredRule != null)
{
    string requiredMessage = requiredRule.ErrorMessage;
}