gpt4 book ai didi

c# - 如何删除操作中的重复代码?

转载 作者:行者123 更新时间:2023-11-30 14:20:09 26 4
gpt4 key购买 nike

我在一个 mvc 应用程序中多次重复了以下代码。

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

// do stuff here
....
return ....;
}

到目前为止,这个模式被使用了 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>());
}

通常我需要访问 View 中的对象。此特定代码仅在一个 Controller 中使用,但我可能需要在具有不同对象和 View 的其他 Controller 中使用类似的代码。

最佳答案

如果所有操作都需要声明,那么您可以尝试在 OnActionExecuting 中检索它,并在失败时将结果设置为 ViewResult。如果只有一些操作,可能需要一个 ActionFilter,它会在执行方法之前检查以确保声明可用,如果不可用,则设置正确的 View 。

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

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;
...
}

关于c# - 如何删除操作中的重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1676103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com