gpt4 book ai didi

asp.net-mvc - 在 Controller 操作方法中重用代码的最佳方法

转载 作者:行者123 更新时间:2023-12-03 03:02:11 24 4
gpt4 key购买 nike

我在同一个 Controller 类中有一些看起来几乎相同的代码,例如设置 viewbags 来填充所有下拉列表,相同的代码适用于我的 Post 和 get Create 和 Edit 操作方法。所以我在 Controller 类的末尾创建了一个私有(private)方法,如下所示:-

private void populateViewBags()
{
string controllerName = RouteData.Values["controller"].ToString();
ViewBag.PossibleDataCenters = repository.AllDataCenter().OrderBy(a => a.Name).ToList();
ViewBag.PossibleZones = repository.AllZone().OrderBy(a => a.Name).ToList();
List<string> s = new List<string>();
s.Add(controllerName.ToLower());
ViewBag.Products = repository.GetProducts(s).OrderBy(a => a.COMPONENTNAME).ToList();
ViewBag.Sites = repository.GetSDOrg().OrderBy(a => a.NAME).ToList();
ViewBag.Customers = repository.FindAccountDefinition(null).ToList();
}

我在我的操作方法中调用这个方法。那么重用代码是正确的方法吗?谢谢

最佳答案

有两种标准方法可以做到这一点。

第一种方法 - 重写 Controller 类的 OnActionExecuting 和/或 OnActionExecuted 方法:

public class HomeController: Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
string controllerName = RouteData.Values["controller"].ToString();
ViewBag.ControllerName = controllerName;
}

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
string controllerName = RouteData.Values["controller"].ToString();
ViewBag.ControllerName = controllerName;
}
}

您还可以创建实现这些方法的抽象基本 Controller ,然后从抽象 Controller 继承具体 Controller ,这样就不会在每个 Controller 中重复代码。

第二种方法 - 制作自定义 ActionFilter 属性并装饰每个需要执行其他操作的 Controller 。

public class MyActionFilterAttribute: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string controllerName = filterContext.RouteData.Values["controller"].ToString();
filterContext.Controller.ViewBag.ControllerName = controllerName;
}

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
string controllerName = filterContext.RouteData.Values["controller"].ToString();
filterContext.Controller.ViewBag.ControllerName = controllerName;
}
}

然后只需装饰 Controller ,例如:

[MyActionFilter]
public class HomeController: Controller
{
// ....
}

更新:过滤器方法的额外灵 active ,如果您需要基于每个操作而不是 Controller 中的所有操作进行过滤,也可以:

public class HomeController: Controller
{
[MyActionFilter]
public ActionResult MyAction()
{
//...
}
}

关于asp.net-mvc - 在 Controller 操作方法中重用代码的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18164583/

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