在每个请求上执行代码

在每个请求上执行代码

问题描述:

我希望能够在将数据填充到ViewData的每个请求上执行一些代码。目前我有一个基础控制器类,所有我的控制器继承,我重写OnActionExecuting并在那里。在每个请求上执行代码

我唯一关心的是这种方法是谁曾经创建一个新的控制器将有继承形式的基类。

有没有办法在global.asax中注册一些东西,就像使用自定义模型绑定器一样,它会运行每个请求?有点像全局动作过滤器或其他东西。

+3

我对每个项目采取的第一步是添加一个空的控制器基类,以允许所有控制器使用代码。阅读MVC in Action后,我习惯了这种习惯,这是作者的建议之一。我认为你现在采取的方法是正确的。 – mkedobbs 2009-11-30 17:11:16

您可以使用custom action invoker,而不是使用基本控制器类(我认为这是大多数情况下的最佳选择)。我会从内置的动作调用器中派生出来,并将其添加到所需的额外内容中。您可以在应用程序启动期间在global.asax中注册动作调用器,并且可以重写OnActionExecuting/OnActionExecuted/OnResultExecuting/OnResultExecuted。例如,您可以使用OnResultExecuting添加一些ViewData。此时您将知道已完成的操作并知道ActionResult的类型。

+0

这是什么我一直在寻找并且应该工作得很好,我已经有了一个自定义控制器工厂,所以我可以关闭会话,所以添加这个很简单。 – 2009-12-02 15:52:03

global.asax中,您可以添加一个处理程序到Application_BeginRequest,它在每个HTTP请求之前运行。您也可以创建custom HTTP module来处理相同的问题。

+0

是的,我知道这一点。这是所有MVC的东西都被注册的地方。虽然这里没有特定的MVC,但我猜测有一种方法可以添加一些对象,以便我可以使用它。就像添加客户模型绑定器一样,您可以在global.asax文件中执行此操作:“ModelBinders.Binders.Add(typeof(MyModelBinder,new MyModelBinder());”然后当模型绑定发生时,您的自定义类会自动调用,因为你已经注册了,这是在global.asax文件中完成的。 – 2009-11-30 18:06:56

+0

小事情:从global.asax访问HttpContext.Current.Session不会工作,因为这时Session对象没有设置。 – Moulde 2013-02-22 13:22:06