如何在我的操作中删除重复的代码?

Sea*_*anX 3 c# asp.net-mvc refactoring

我在mvc应用程序中重复了几次以下代码.

    public ActionResult AnAction(int Id)
    {           
        var claim = GetClaim(Id);
        if (claim == null)
        {
            return View("ClaimNotFound");
        }

        // do stuff here
        ....
        return ....;
    }
Run Code Online (Sandbox Code Playgroud)

到目前为止,这种模式使用了4次,而且变得越来越难看.重构它的最佳方法是什么?

编辑:
几个示例用法

    public ActionResult Claim(int Id)
    {           
        var claim = GetClaim(Id);
        if (claim == null)
        {
            return View("ClaimNotFound");
        }

        return View("Claim", claim);
    }

    public ActionResult MedicalPV(int Id)
    {
        var claim = GetClaim(Id);
        if (claim == null)
        {
            return View("ClaimNotFound");
        }

        return PartialView(claim.MedCerts.AsQueryable<MedCert>());
    }
Run Code Online (Sandbox Code Playgroud)

通常我需要访问视图中的对象.此特定代码仅用于一个控制器,但我可能需要在具有不同对象和视图的其他控制器中使用类似的代码.

tva*_*son 7

如果所有操作都需要声明,那么您可以尝试在OnActionExecuting中检索它,并在失败时将Result设置为ViewResult.如果只是某些操作,可能需要它,在执行方法之前检查以确保声明可用的ActionFilter,如果没有,则设置正确的视图.

private Claim Claim { get; set; }

public override void OnActionExecuting( ActionExecutingContext context )
{
    this.Claim = GetClaim( int.Parse( context.RouteData["id"] ) );
    if (this.Claim == null)
    {
        context.Result = View( "ClaimNotFound" );
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

public class RequiresClaimIdAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting( ActionExecutingContext context )
    {
         var claim = GetClaim( int.Parse( context.RouteData["id"] ) );
         if (claim == null)
         {
              context.Result = new ViewResult
              {
                   ViewName = "ClaimNotFound",
                   ViewData = context.Controller.ViewData
              };
         }
         else
         {

              var property = context.Controller
                                    .GetType()
                                    .GetProperty( "Claim",
                                                   BindingFlags.Public
                                                   | BindingFlags.NonPublic
                                                   | BindingFlags.Instance);
              if (property != null)
              {
                   property.SetValue(context.Controller,claim);
              }
         }
    }
}

[RequiresClaimId]
public ActionResult AnAction( int id )
{
    this.Claim.Updated = DateTime.Now;
    ...
}
Run Code Online (Sandbox Code Playgroud)