简体   繁体   English

ASP.NET MVC Actions中的冗余消除

[英]Redunancy elimination in ASP.NET MVC Actions

Is this action too redundant - is there a better way to simplify it?这个动作是不是太多余了——有没有更好的方法来简化它?

[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");
}

All of these seem to me to have a code smell...所有这些在我看来都有代码的味道......

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

This change seems to preserve your original intentions a little better:此更改似乎更好地保留了您的初衷:

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");

No, I'd say you only need the last IsValid-check.不,我会说你只需要最后一个 IsValid 检查。

Of course, you might want to keep the second to last one, as changing the password if it's the same as the old one might result in unnecessary log-events or whatnot, depending on the underlying membership framework.当然,您可能希望保留倒数第二个,因为如果密码与旧密码相同,则更改密码可能会导致不必要的日志事件或诸如此类的情况,具体取决于基础成员资格框架。

move all your basic validation like string length and type to the model level, this will reduce lots of code, you can check out the xval framework将所有基本验证(例如字符串长度和类型)移动到 model 级别,这将减少大量代码,您可以查看xval框架

Yeah, I would just keep the last IsValid check, so:是的,我会保留最后的 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");
}

Although, @j-steen makes a good point about the second to last check possibly saving you some overhead.虽然,@j-steen 对倒数第二个检查提出了一个很好的观点,可能会为您节省一些开销。

Nested if statements may help simplify the code:嵌套的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM