MVC - 显示多个类级别验证错误消息

时间:2012-09-12 13:27:29

标签: asp.net asp.net-mvc-3 validation attributes

我有一个viewmodel,在验证时,我想比较多个字段。 我有一个自定义属性,它接受viewmodel并执行所需的验证。 我正在使用自定义属性[ValidateThisForm]

来装饰viewmodel类
[AttributeUsage(AttributeTargets.Class)]
public class ValidateThisForm : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        ViewModel _viewModel = value as ViewModel;

        if (_viewModel.TestOne == false && _viewModel.TestTwo == false)
        {
            ErrorMessage = "Form Incomplete: Please correct";
            return false;
        }
        else
        {
            return true;
        }
    }
}

问题是,我想执行几个“类级别”验证。因此,在我看来,我只能在表单上的一个位置显示这些错误:

<td class = "field-validation-error">@Html.ValidationMessageFor(viewmodel => viewmodel)</td>

有没有办法可以在表单上的不同位置显示多个“类级别”错误?

1 个答案:

答案 0 :(得分:0)

假设您的班级目前看起来像这样:

[ValidateThisForm]
public class MyViewModel
{
    public bool TestOne { get; set; }
    public bool TestTwo { get; set; }
}

如果您要执行复杂的模型级验证,而不能简单地注释单个属性,则可以使用IValidatableObject挂钩到验证管道中:

public class MyViewModel : IValidatableObject
{
    public bool TestOne { get; set; }
    public bool TestTwo { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    { 
      if (TestOne == false && TestTwo == false) 
      {
          yield return new ValidationResult("Form Incomplete: Please correct")
      }
    }
}

您可以继续yield return尽可能多的验证邮件。您可以使用@Html.ValidationSummary

在客户端上显示所有内容

如果您希望消息与特定控件一起显示,ValidationResult构造函数会对受影响属性的memberNames进行重载,以便您可以更改Validate方法这样:

if (TestOne == false && TestTwo == false) 
{
    yield return new ValidationResult("Form Incomplete Message", new[] {"TestOne"})
}

然后,您可以使用ValidationMessageFor HTML帮助程序为该特定属性提供验证消息,如下所示:

@Html.ValidationMessageFor(Function(model) model.TestOne )

为了进一步阅读,Scott Guthrie写了一篇关于使用IValidatableObject作为blog post introducing new features in MVC3的一部分的文章,并在此后不久发布了关于class level validation更多细节的后续帖子。