我有一个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>
有没有办法可以在表单上的不同位置显示多个“类级别”错误?
答案 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更多细节的后续帖子。