2009-06-16 31 views
0

此操作是否過於冗餘 - 是否有更好的方法來簡化它?ASP.NET MVC操作中的冗餘消除操作

[Authorize, AcceptVerbs(HttpVerbs.Post)] 
public ActionResult ChangePassword(string oldPassword, string newPassword, string confirmPassword) 
{ 
    var oldPasswordValidationResults = _validatorProvider.Validate<IStringLengthValidator>(oldPassword); 
    oldPasswordValidationResults.Where(r => !r.Passed) 
           .Each(r => ModelState.AddModelError("OldPassword", "Please enter your old password.")); 


    var newPasswordValidationResults = _validatorProvider.Validate<IStringLengthValidator>(newPassword); 
    newPasswordValidationResults.Where(r => !r.Passed) 
           .Each(r => ModelState.AddModelError("NewPassword", "Please enter a new password.")); 

    if (!ModelState.IsValid) 
     return View(); 

    if (newPassword != confirmPassword) 
     ModelState.AddModelError("ConfirmPassword", "The passwords do not match."); 

    if (!ModelState.IsValid) 
     return View(); 

    if (!_userMembershipService.ChangePassword(oldPassword, newPassword)) 
     ModelState.AddModelError("_FORM", "Unable to change your password."); 

    if (!ModelState.IsValid) 
     return View(); 

    return View("ChangePasswordSuccessful"); 
} 

所有這些在我看來,有一個代碼味道...

if (!ModelState.IsValid) 
    return View(); 

回答

1

這一變化似乎保留原始意圖更好一點:

if (newPassword != confirmPassword) 
{ 
    ModelState.AddModelError("ConfirmPassword", "The passwords do not match."); 
    return View(); 
} 

if (!_userMembershipService.ChangePassword(oldPassword, newPassword)) 
{ 
    ModelState.AddModelError("_FORM", "Unable to change your password."); 
    return View(); 
} 

return View("ChangePasswordSuccessful"); 
+0

我喜歡這個!謝謝 – 2009-10-12 14:11:10

0

不,我說你只需要最後的IsValid檢查。

當然,您可能希望保持倒數第二,因爲如果密碼與舊密碼相同,則可能會導致不必要的日誌事件或不必要的事情,具體取決於基礎成員資格框架。

0

動如字符串長度和類型的模型級別所有的基本驗證,這將減少大量的代碼,你可以檢查出xval框架

0

呀,我只想保留最後IsValid的檢查,所以:

[Authorize, AcceptVerbs(HttpVerbs.Post)] 
public ActionResult ChangePassword(string oldPassword, string newPassword, string confirmPassword) 
{ 
    var oldPasswordValidationResults = _validatorProvider.Validate<IStringLengthValidator>(oldPassword); 
    oldPasswordValidationResults.Where(r => !r.Passed).Each(r => ModelState.AddModelError("OldPassword", "Please enter your old password.")); 


    var newPasswordValidationResults = _validatorProvider.Validate<IStringLengthValidator>(newPassword); 
    newPasswordValidationResults.Where(r => !r.Passed).Each(r => ModelState.AddModelError("NewPassword", "Please enter a new password.")); 


    if (newPassword != confirmPassword) 
     ModelState.AddModelError("ConfirmPassword", "The passwords do not match."); 

    if (!_userMembershipService.ChangePassword(oldPassword, newPassword)) 
     ModelState.AddModelError("_FORM", "Unable to change your password."); 

    if (!ModelState.IsValid) 
     return View(); 

    return View("ChangePasswordSuccessful"); 
} 

雖然,@ J-斯廷使得關於第二個好點的最後一次檢查可能爲您節省一些開銷。

0

嵌套if報表可以幫助簡化代碼:

[Authorize, AcceptVerbs(HttpVerbs.Post)] 
public ActionResult ChangePassword(string oldPassword, string newPassword, string confirmPassword) 
{ 
    var oldPasswordValidationResults = _validatorProvider.Validate<IStringLengthValidator>(oldPassword); 
    oldPasswordValidationResults.Where(r => !r.Passed) 
           .Each(r => ModelState.AddModelError("OldPassword", "Please enter your old password.")); 


    var newPasswordValidationResults = _validatorProvider.Validate<IStringLengthValidator>(newPassword); 
    newPasswordValidationResults.Where(r => !r.Passed) 
           .Each(r => ModelState.AddModelError("NewPassword", "Please enter a new password.")); 

    if (ModelState.IsValid) { 
     if (newPassword == confirmPassword) { 
      if (_userMembershipService.ChangePassword(oldPassword, newPassword)) { 
       return View("ChangePasswordSuccessful"); 
      } 
      else { 
       ModelState.AddModelError("_FORM", "Unable to change your password."); 
      } 
     } 
     else { 
      ModelState.AddModelError("ConfirmPassword", "The passwords do not match."); 
     } 
    } 

    return View(); 
}