获取将ModelState的IsValid设置为false的验证属性

时间:2017-06-29 12:41:38

标签: c# asp.net-mvc validationattribute

有没有办法知道哪个验证属性导致ModelState.IsValid == false

A类

public class A
{
    [Required(ErrorMessage = "Required")]
    [DataFormat(DataType.Date, "Must be a Date (DD/MM/YEAR)")]
    [NoFutureDate(ErrorMessage = "Future date is not allowed")]
    public DateTime? Date { get; set; }
}

现在当我发布上面提到的类强烈输入它的视图的表单时,验证属性将相应地起作用。

如果3个验证属性中的1个返回错误,请说[NoFutureDate(ErrorMessage = "Future date is not allowed")]

OR

如果3个验证属性中有2个返回错误,请说[NoFutureDate(ErrorMessage = "Future date is not allowed")][DataFormat(DataType.Date, "Must be a Date (DD/MM/YEAR)")]

我的财产肯定没有通过验证。

问题

有没有办法知道哪个验证属性导致错误? 是[DataFormat]一个还是[DataFormat][NoFutureDate]

2 个答案:

答案 0 :(得分:1)

您可以使用ModelState.IsValidField("YourField")ModelState["Date"].Errors.Contains()来检测其中哪一个发生错误。

public ActionResult Test(YourModel model)
{
    if(!ModelState.IsValidField("Date"))
    {
        var futureDateError = new ModelError("Future date is not allowed");
        var dataFormatError = new ModelError("Must be a Date (DD/MM/YEAR)");

        bool IsFutureDateError = ModelState["Date"].Errors.Contains(futureDateError);
        bool isFormatError     = ModelState["Date"].Errors.Contains(dataFormatError);
    }
    ...... // your code here
}

答案 1 :(得分:1)

您好在以下方式中,您可以通过编程方式获取modelstate字段错误。

方式1:

if (!ModelState.IsValid) 
 {
    var modelErrors = new List<string>();
    foreach (var modelState in ModelState.Values) 
     {
      foreach (var modelError in modelState.Errors)
      {
        modelErrors.Add(modelError.ErrorMessage);
      }
     }

  }

方式2:

string Errors = string.Join("; ", ModelState.Values
                                        .SelectMany(x => x.Errors)
                                        .Select(x => x.ErrorMessage));

由于

KARTHIK