从依赖于其他方法返回结果的方法中删除重复代码



控制器类中的。MVC应用程序我有一个方法

        protected ActionResult VerifySanctions(string sanction)
        {
        bool hasSanctions = this.qualificationSanctionsService.HasSanctions(sanction);

        if (hasSanctions)
        {                               
              return this.RedirectToAction("Index", "Home");
        }
        return null;
        }

此方法包含来自不同控制器的不同其他操作的公共逻辑我决定为控制器创建一个基类,它将保留这个方法并从中派生其他控制器。但问题是,当我从派生类操作调用此方法时,我需要验证是否为空,然后返回结果,例如

    public ActionResult RegistrationTracking(EncryptedId sourceId)
    {
        // some code
        var registration = learnerRegistrationService.Get(sourceId);
        var result = this.VerifySanctions(registration.Qualification);
        if (result != null)
        {
            return result;
        }
         // some code
        return this.View();
    }

在其他操作中,我需要验证结果是否不为空

    public ActionResult Index(EncryptedId achievableVersionId)
    {
        var achievableVersion = achievableVersionService.Get(achievableVersionId);
        var verificationResult = this.VerifySanctions(achievableVersion);
        if (verificationResult != null)
        {
            return verificationResult;
        }          
         //some code
        return View();
    }

我想避免重复的代码,谁可以帮助我的例子或建议?我需要的是,如果不通过验证方法VerifySanction()然后什么都不做,否则返回操作结果。

可以像这样更新动作

        public ActionResult ModifyUnits(EncryptedId sourceId)
    {
        var registration = learnerRegistrationService.Get(sourceId);
        Check.Require(registration != null);
        Check.Require(registration.Enrolment != null, "QualificationEnrolment is null - RegistrationAmendments / ModifyUnits");
        var result = this.VerifySanctions(registration.Qualification, LookupOrganisationAchievableStatus.Sanction3);
        if (result != null)
        {
            return result;
        }
        if (!this.organisationAchievableService.IsAccessibleAchievableVersion(registration.Qualification.Id, this.GetOrganisationId()))
        {
            return new PopupFormResult().Notify(MUI.PleaseSelectACentre);
        }
        SetEnrolmentViewData(registration.Enrolment);
        ViewData["registrationId"] = sourceId;
        var isComposite = registration.Enrolment.IsComposite();
        ViewData["isComposite"] = isComposite;
        this.SetSelectedUnitsViewData(registration, isComposite);
        this.SetSelectedQualificationUnitsViewData(isComposite, registration);
        return this.PartialView("ModifyUnits", new List<UnitDisplay>());
    }

Thanks in advance

应该可以:

 public ActionResult RegistrationTracking(EncryptedId sourceId)
    {
        var registration = learnerRegistrationService.Get(sourceId);                    
        return VerifySanctions(registration.Qualification, View());
    }
    private ActionResult VerifySanctions(Sanction sanction, ViewResult view)
    {
        bool hasSanctions = this.qualificationSanctionsService.HasSanctions(sanction);
        if (hasSanctions)
        {
            return RedirectToAction("Index", "Home");
        }
        return view;
    }

您可以在所有控制器扩展的默认控制器中添加方法嵌入这个逻辑。例如,

private ActionResult ViewWithSanction(string sanction, ActionResult default)
{
  bool hasSanctions = this.qualificationSanctionsService.HasSanctions(sanction);
  if (hasSanctions) {                               
    return this.RedirectToAction("Index", "Home");
  }
  return default;
}

然后你的方法可以是

public ActionResult RegistrationTracking(EncryptedId sourceId)
{
    var registration = learnerRegistrationService.Get(sourceId);
    return ViewWithSanction (registration.Qualification, View());
}
public ActionResult Index(EncryptedId achievableVersionId)
{
    var achievableVersion = achievableVersionService.Get(achievableVersionId);
    return ViewWithSanction (achievableVersion, View());
}

传递hasSanctions为false时执行的Func<ActionResult>

private ActionResult VerifySanctions(Sanction sanction, Func<ActionResult> whenNoSanctions)
{
    bool hasSanctions = this.qualificationSanctionsService.HasSanctions(sanction);
    if (hasSanctions)
    {
        return RedirectToAction("Index", "Home");
    }
    return whenNoSanctions();
}

,

 return VerifySanctions(registration.Qualification, ()=> { //any code that returns ActionResult });

更新:

您可以提取非空部分作为单独的方法

private ActionResult WhenNoSanctions()
{
        if(!this.organisationAchievableService.IsAccessibleAchievableVersion(registration.Qualification.Id, this.GetOrganisationId()))
        {
            return new PopupFormResult().Notify(MUI.PleaseSelectACentre);
        }
        SetEnrolmentViewData(registration.Enrolment);
        ViewData["registrationId"] = sourceId;
        var isComposite = registration.Enrolment.IsComposite();
        ViewData["isComposite"] = isComposite;
        this.SetSelectedUnitsViewData(registration, isComposite);
        this.SetSelectedQualificationUnitsViewData(isComposite, registration);
        return this.PartialView("ModifyUnits", new List<UnitDisplay>());
}

调用verifyssanctions作为

 return VerifySanctions(registration.Qualification, WhenNoSanctions);

相关内容

最新更新