如何在ASP.NET MVC 2中的所有控制器上运行函数?

时间:2011-02-17 23:25:41

标签: asp.net-mvc controller

我有一个功能:

  • 从模型中获取一些信息(完成)
  • 从cookie(已完成)和
  • 获取一些信息
  • 在每个控制器上的ViewData(在视图上)设置新信息

此外,当控制器正在调用时,该功能需要在每个控制器上运行(我不知道如何执行此操作)。

我在BaseController上编写了这个函数,但是出现了错误:

  

对象引用未设置为对象的实例。

而且,我认为这不是正确的方法。我正在使用ASP.NET MVC 2和.NET 3.5。

感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

创建自定义操作过滤器

public class MyActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // if the ActionResult is not a ViewResult (e.g JsonResult, ContentResult),
        // there is no ViewData so don't do anything.
        var viewResult = filterContext.Result as ViewResult;

        if (viewResult != null)
        {
           // call your function, do whatever you want to the result, e.g:
           viewResult.ViewData["someKey"] = someData;
        }
    }
}

把那个坏孩子扯到你的基地控制器上:

[MyActionFilter]
public class BaseController : Controller
{

}

现在,在执行每个Controller的每个ActionResult之后,将执行您的动作过滤器逻辑。

你还可以参加其他一些活动,但听起来你想要在动作完成之后做一些,所以我认为上面的内容应该适合你。

答案 1 :(得分:0)

在升级之前它不会帮助您,但在ASP.NET MVC 3中,您可以使用全局操作过滤器来实现此目的。

http://weblogs.asp.net/gunnarpeipman/archive/2010/08/15/asp-net-mvc-3-global-action-filters.aspx