2011-07-23 72 views
25

已經有一個answered question關於同一主題,但從'09我認爲它已過時。如何在ASP.NET MVC 3中正確實現「確認密碼」?

如何正確地實施在ASP.NET MVC 3 「確認密碼」?

我看到網絡上有很多選擇,他們大多在模型中使用CompareAttributelike this one

的問題是絕對ConfirmPassword shound't是模型,因爲它不應該堅持。

由於從MVC整個unobstrusive客戶端驗證3依靠模型,我不喜歡把一個ConfirmPassword財產上我的模型,我該怎麼辦?

我應該注入一個自定義的客戶端驗證功能嗎?如果是的話。如何?

+4

並非所有的視圖模型* Model *中的類型(或類型成員)必須持久化。你的服務器驗證呢? – oleksii

+1

不僅ConfirmPassword,而且密碼不應該被保留。除了有關AutoMapper的說明外,Darin Dimitrov的ViewModel解決方案是正確的。在保存哈希密碼之前,您應該始終確保哈希密碼的安全。 –

+0

達林從來沒有表明他會堅持明文密碼,他只是說他會將視圖模型映射到領域模型,並將其傳遞給存儲庫。我認爲哈希密碼更正確的細節屬於持久性代碼而不是表現代碼(爲什麼我的MVC控制器必須知道安全哈希的細節?)。 –

回答

70

由於從MVC 3全unobstrusive客戶端驗證依靠 模型,我不喜歡把一個ConfirmPassword財產上我 模型,我該怎麼辦?

一個完全同意你的看法。這就是爲什麼你應該使用視圖模型。然後在您的視圖模型(特別是給定視圖的要求而設計的一類),你可以使用[Compare]屬性:

public class RegisterViewModel 
{ 
    [Required] 
    public string Username { get; set; } 

    [Required] 
    public string Password { get; set; } 

    [Compare("Password", ErrorMessage = "Confirm password doesn't match, Type again !")] 
    public string ConfirmPassword { get; set; } 
} 

,然後讓你的控制器動作,像是

[HttpPost] 
public ActionResult Register(RegisterViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 

    // TODO: Map the view model to a domain model and pass to a repository 
    // Personally I use and like AutoMapper very much (http://automapper.codeplex.com) 

    return RedirectToAction("Success"); 
} 
+0

我沒有'Compare'屬性可用...我錯過了什麼? – jocull

+0

@jocull,erm,ASP.NET MVC 3?如果您使用的是舊版本,則不會具有此屬性。 –

+0

這絕對是MVC 3 ...我錯過了一個包含的程序集? – jocull

3

看看一個MVC3應用程序的默認模板VS2010。

它包含一個包含Password和ConfirmPassword屬性的RegisterModel('ViewModel')。驗證在ConfirmPassword上設置。

所以答案是,在MVC模型不必是(通常不是)與您的業務模式。