[英]Redunancy elimination in ASP.NET MVC Actions
这个动作是不是太多余了——有没有更好的方法来简化它?
[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();
此更改似乎更好地保留了您的初衷:
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");
不,我会说你只需要最后一个 IsValid 检查。
当然,您可能希望保留倒数第二个,因为如果密码与旧密码相同,则更改密码可能会导致不必要的日志事件或诸如此类的情况,具体取决于基础成员资格框架。
将所有基本验证(例如字符串长度和类型)移动到 model 级别,这将减少大量代码,您可以查看xval框架
是的,我会保留最后的 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-steen 对倒数第二个检查提出了一个很好的观点,可能会为您节省一些开销。
嵌套的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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.