2017-02-24 64 views
0

我使用C#MVC 4 serversided。 Gerenel網站的目的是獲取一些輸入的文本信息以及用戶提交的文件。MVC 4自動模型驗證stum on ViewModel與嵌套ViewModel

因此,我使用一個ViewModel,它是保存有關用戶輸入的文本信息(稱爲FileInformationViewModel)的信息的「父級」ViewModel。這個「父」ViewModel包含另一個「子」ViewModel,我們稱之爲FileUploadViewModel。

這些視圖模型的每一個都是從IValidateObject派生的,並擁有它們的自定義驗證函數,只驗證模型的當前屬性。這意味着「父」ViewModel不會對「子」ViewModel進行任何驗證,因爲「子」ViewModel擁有它自己特定的驗證功能。

「孩子」ViewModel將通過MVC 4提供的自動模型驗證進行驗證,ModelState將按預期設置。之後,通過MVC模型綁定邏輯將「子」ViewModel成功綁定到「父」ViewModel。 如果驗證失敗的「孩子」ViewModel「父」ViewModel的驗證功能將不再處理,但我想處理模型綁定自動驗證兩個驗證。有什麼辦法來實現這一點,或者是唯一可以手動驗證我的控制器上的ViewModels的方法嗎?

爲了說明我的建築,這裏的 「父」 視圖模型:

public class FileInformationViewModel : IValidatableObject 
{ 
    public FileInformationViewModel() 
    { 
     ViewModel1 = new FileUploadViewModel(); 
    } 

    public FileUploadViewModel ViewModel1 { get; set; } 
    public string InputFieldToBeSet { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (!string.IsNullOrWhiteSpace(InputFieldToBeSet)) 
     { 
      var result = new ValidationResult("Enter some information, please!", new[] { nameof(InputFieldToBeSet) }); 
      yield return result; 
     } 
    } 

回答

0

使用IValidatableObject短路驗證。返回的第一個錯誤將導致進一步的驗證停止。這只是比賽的休息時間。這是沒有辦法的。

如果您一次需要所有的錯誤,那麼您需要讓模型聯編程序處理驗證,在視圖模型屬性上使用數據註釋。實際上,您可以通過這種方式處理幾乎所有可以想到的場景,因爲您可以隨時添加自己的驗證屬性或者有多個驗證屬性庫。

+0

感謝您的快速回答。事實上,我想知道如果我可以通過創建自己的數據註釋,如果需要。但是在驗證功能中我需要做一些更復雜的驗證。原來,我從SubModel中移除了'IValidationObject',並將錯誤返回給父模型,而是在prent級別添加了childs錯誤。不過,我認爲你的建議在大多數情況下是最合適的。 – doodles975