2009-07-16 150 views
19

關於如何在ASP.NET MVC中實現驗證的大部分提示似乎圍繞模型(在模型和控制器之間構建服務層或使用驗證屬性裝飾模型的屬性) 。驗證ASP.NET MVC中的ViewModels

在我的應用程序中,我使用ViewModels控制器和視圖之間的所有通信。

我有一個名爲'EmailAddress'的屬性的名爲'LoginViewModel'的登錄頁面的ViewModel。

當用戶輸入他們的電子郵件地址並點擊提交時,此ViewModel被填充併發送到驗證電子郵件地址的控制器。

它必須是有效的電子郵件地址,並且用戶必須來自向系統註冊的域。

什麼是一種方便的方式來添加驗證?我應該將驗證放入ViewModel本身嗎?還是應該留在控制器中?

回答

5

「我應該將驗證放在ViewModel本身嗎?或者它應該留在控制器中「我同意Robert的意見,但我會添加一個插件以實現額外的自動化功能

如果您看一下諸如xVal之類的工具,可以看到例程驗證(例如,必填字段,範圍,與正則表達式匹配的字符串)可以通過裝飾數據類的字段自動完成,事實上,xVal可以自動編寫用於例行驗證的JavaScript,以便它在客戶端執行,而不需要編寫任何代碼。這個用戶是在我們的數據庫中註冊的域的成員嗎?)在模型層本身內部發生服務器端

使用ViewModel習語會給這個方案帶來一些挑戰我目前的方法是嵌入我的實體對象s在我的視圖模型中,例如

public class Contact { 
    [Required] 
    string Name { get; set; } 
} 

public class ContactView { 
    public Contact Contact { get; set; } 
    public string SomeOtherViewProperty { get; set; } 
} 

,然後在控制器,淺驗證更新模型時發生的情況:

UpdateModel(contactViewModel.Contact, "Contact"); 

和需要更多信息或更復雜的計算中發生的驗證模型層本身的內部。

另一種方法是不嵌入實體對象,而只是在兩者之間映射各個字段。我最近意識到一個名爲AutoMapper的工具,它自動鏈接域和視圖模型對象之間的字段。它看起來應該支持這種驗證方法,儘管我還沒有使用它。

+0

偉大的想法,基思!目前我的策略和你一樣 - 在ViewModels中嵌入模型。 我想要的是,如果模型和ViewModels都可以用相同的方式實現驗證,而且像xVal這樣的JS框架可以與任何一個無縫工作。 這將是最靈活的方式。我不認爲驗證應該與模型完全綁定。 – Jonathan 2009-07-17 01:43:51

3

NerdDinner tutorials顯示驗證發生在模型的部分類(即Linq to SQL或Entity Framework)中。但是,由於您使用的是視圖模型,您可以將驗證邏輯放在那裏。

驗證邏輯不在控制器中。相反,它是從一個檢查屬性控制器,即ModelState.IsValid迷上

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) { 

    if (ModelState.IsValid) { 

     try { 
      dinner.HostedBy = "SomeUser"; 

      dinnerRepository.Add(dinner); 
      dinnerRepository.Save(); 

      return RedirectToAction("Details", new { id=dinner.DinnerID }); 
     } 
     catch { 
      ModelState.AddModelErrors(dinner.GetRuleViolations()); 
     } 
    } 

    return View(new DinnerFormViewModel(dinner)); 
} 

全部細節在這裏:

建立模型
http://nerddinnerbook.s3.amazonaws.com/Part3.htm

這裏:

ViewData and ViewModel
http://nerddinnerbook.s3.amazonaws.com/Part6.htm

+0

**注意:**對於更新的NerdDinner,請看這裏:http://nerddinner.codeplex.com/SourceControl/changeset/view/ef63780655b0 – 2013-02-21 18:22:01