在到达控制器代码之前执行代码

时间:2015-12-09 10:48:41

标签: c# asp.net-mvc asp.net-mvc-3

我打算创建一个 MasterController ,根据URL参数决定使用哪些配置。

  1. 我的第一个想法是创建一个 MasterController 。对服务器的所有请求都将被重定向到此控制器,然后,此 MasterController 将决定使用哪个控制器,并重定向到它。问题是这会产生太多的请求。

  2. 我的第二个想法是在每个控制器的开头调用一个函数,如果需要,它会重定向到正确的控制器。问题是一样的:它会增加请求的数量。

  3. 具体示例:想象一下,我有以下网址:

      

    HTTP:\\ myapp.com \ showController1 =真

         

    HTTP:\\ myapp.com \ ABCD showController1 =真

    当服务器收到请求时,我希望最终结果相同:show Controller1 ,与homeControllerabcdController的请求无关。

    为了使这个工作,在到达女巫控制器之前,我需要决定在url参数上调用depenind的控制器。但我希望尽量减少服务器和浏览器之间的请求数量。

    可以在不提出额外请求的情况下实现此目的吗?

1 个答案:

答案 0 :(得分:2)

在问题版本之后,我发现很可能只需指定正确的路线就可以解决这个问题。

路由发生在将处理请求的控制器选择为instanced之前。

路由的结果是选择控制器,操作并从URL获取参数。因此,指定正确的路径将允许您以非侵入方式选择rigth控制器(这是原始答案所做的)。但是,如果您将参数指定为URL段而不是查询字符串参数,那么这只会更有效。如果没有,请回到原来的答案。

原始答案

虽然问题不是很清楚,但看起来您希望根据URL选择特定的控制器。这样做的一种方法是实现自己的IControllerFactory,并将其注册为ASP.NET MVC控制器工厂,这样做:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

在自定义MyControllerFactory的实现中,您必须实现此成员:

  • CreateController(RequestContext, String):使用指定的请求上下文创建指定的控制器。
  • GetControllerSessionBehavior(RequestContext, String):获取控制器的会话行为。
  • ReleaseController(IController):释放指定的控制器。

特别是,第一种方法接收控制器的名称,以及包含RouteData的信息 - 包括参数信息 - 和HttpContext,并返回实例控制器。

一般来说,做这件事并不是一个好主意,因为MVC会按照预期停止工作"并且稍后维护此项目的人将无法理解其中的内容上。