我在同一个 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/