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

标签 asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

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

相关文章:

c# - azure "The remote server returned an error: (530) Not logged in."

asp.net-mvc - 添加ELMAH并更改elmah.mvc.route之后,旧路由仍然可用

asp.net-mvc - 当我的模型属性之一是整数时,为什么会出现数字上/下控制

javascript - Razor 语法防止 Razor 代码片段后出现空格

c# - 将应用程序部署到 IIS(MVC3、EF 4.3)后分页出现意外结果

jquery - 在 asp.net mvc3 中使用 jquery unobtrusive 显示元素下方的验证消息

c# - VS 2017 : Property value is not valid. - 启用 SSL

c# - 如何解决 VS2012 中简单的 Nuget 安装导致 MVC4 Twitter Bootstrap 项目失败的问题?

asp.net-mvc - 将 IIS 7.5 预热模块与 ASP.NET MVC AuthorizeAttribute 结合使用

c# - model 和 viewmodel mvc 中的验证