2012-09-12 47 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