2011-03-07 112 views
5

我想驗證用戶更改其密碼。這個動作結果所需的PasswordChange類有4個屬性。其中之一是數據庫密碼,即時通訊與一個「CurrentPassword」屬性進行比較,確保用戶只有在知道他們當前的密碼時才能更改密碼(網站上的標準流程)重新評估ModelState.IsValid屬性

問題我有數據庫密碼是集(如圖所示)的ActionResult不過的ModelState內似乎得到所謂在此之前,因此返回的「IsValid的」假,因爲它看到數據庫密碼爲「空」的數據庫密碼設置

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult ChangePassword(PasswordChange model) 
    { 
     var User = GetPlayer().User; 
     model.databasePassword = User.Password; 

     if (ModelState.IsValid) 
     { 
      //update the users password 
      User.Updated = SystemDate.Current(); 
      User.Password = model.newPassword.ToLower(); 

      return Redirect("/Player"); 
     } 
     else 
     { 
      return View(model); 
     } 
    } 

怎麼連後我可以重新評估它,或者讓它評估我想要的時間!

回答

1

創建一個PasswordChangeInput視圖模型類並從視圖中傳入需要的內容,然後可以從您的實體模型中單獨驗證。然後,在滿足輸入數據有效之後,您可以使用像automapper這樣的東西將輸入視圖模型映射到實體模型。

要添加:您可以嘗試清除ModelState錯誤,設置databasePassword並重新驗證。找出導致默認模型聯編程序爲databasePassword添加錯誤並將其更改爲無效的原因可能更容易一些。

+0

這幾乎是PasswordChange是什麼。它幾乎是一個有4個屬性的視圖模型。 3從頁面上的數據庫中設置的頁面..這並不能解決問題與獲得modelstate後驗證! – Steve 2011-03-07 21:51:57

+0

好吧,愚蠢的問題,但爲什麼databasePassword需要是一個模型屬性,如果CurrentPassword是? – 2011-03-07 22:01:53

+0

如果您在視圖傳遞回來之後添加內容,它實際上不是視圖的模型。這就是爲什麼我問爲什麼PasswordChange需要databasePassword。 – 2011-03-07 22:07:15

2

檢查錯誤並清除它,如果您分配固定它。簡單的檢查:

model.databasePassword = User.Password; 
if (ModelState["databasePassword"].Errors.Count == 1) 
{ 
    ModelState["databasePassword"].Errors.Clear(); 
} 
+3

這是最佳做法嗎? – FutuToad 2013-03-08 23:39:43