Asp.net mvc 在我的控制器操作方法中重用代码的最佳方法

Asp.net mvc 在我的控制器操作方法中重用代码的最佳方法,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,在同一个控制器类中,我有一些代码看起来几乎相同,例如设置viewbags以填充所有下拉列表,相同的代码应用于我的帖子和get Create and Edit action方法。 因此,我在控制器类的末尾创建了一个私有方法,如下所示:- private void populateViewBags() { string controllerName = RouteData.Values["controller"].ToString(); ViewBag.PossibleDataCen

在同一个控制器类中,我有一些代码看起来几乎相同,例如设置viewbags以填充所有下拉列表,相同的代码应用于我的帖子和get Create and Edit action方法。 因此,我在控制器类的末尾创建了一个私有方法,如下所示:-

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();
}
private void populateViewBags()
{
字符串controllerName=routedData.Values[“controller”].ToString();
ViewBag.PossibleDataCenters=repository.AllDataCenter().OrderBy(a=>a.Name.ToList();
ViewBag.PossibleZones=repository.AllZone().OrderBy(a=>a.Name.ToList();
列表s=新列表();
s、 添加(controllerName.ToLower());
ViewBag.Products=repository.GetProducts.OrderBy(a=>a.COMPONENTNAME.ToList();
ViewBag.Sites=repository.GetSDOrg().OrderBy(a=>a.NAME.ToList();
ViewBag.Customers=repository.FindAccountDefinition(null.ToList();
}
我在action方法中调用这个方法。那么,这是重新使用代码的正确方法吗?
谢谢

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

第一种方法-覆盖控制器类的
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;
    }
}
您还可以创建实现这些方法的抽象基控制器,然后从抽象基控制器继承具体控制器,这样就不会在每个控制器中重复代码

第二种方法-定制
动作过滤器
属性,并修饰每个需要执行额外动作的控制器

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;
    }
}
然后装饰控制器,如:

[MyActionFilter]
public class HomeController: Controller
{
    // ....
}
更新:过滤器方法的额外灵活性,如果您需要基于每个操作进行过滤,而不是控制器中的所有操作,也可以:

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

是的,如果这对你有用,并且你在你的控制器中多次重复使用这段代码,我认为像你在这里所做的那样创建一个私有助手函数没有什么坏处。好主意!如果您不需要在多个控制器中使用相同的逻辑,那么私有方法就足够了。