2012-09-12 69 views
1

我有一个viewmodel,这样,在验证时,我想比较多个字段。 我有一个自定义属性,需要viewmodel并执行所需的验证。 我装饰与自定义的视图模型类属性[ValidateThisForm]MVC - 显示多个类级验证错误消息

[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

是否需要更改其他模型属性的位置?如:** @ Html.ValidationMessageFor(x => viewmodel.PropertyName)** – Xordal

+0

不,理想情况下,我想更新并显示类级别验证代码中某些相同模型属性的错误值。 – Dubh

回答

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方法类似这样的:

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

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

然后你就可以与ValidationMessageFor HTML帮助像这样的特定属性提供验证消息10

为了进一步阅读,Scott Guthrie写了关于使用IValidatableObject作为他的blog post introducing new features in MVC3的一部分,并在随后的一个帖子中更详细地介绍了class level validation