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

Execute code before reaching the controller's code

我的意图是创建一个 MasterController,它根据 URL 参数决定使用什么配置。

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

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

具体例子:假设我有以下URLs:

http:\myapp.com\?showController1=true

http:\myapp.com\abcd?showController1=true

当服务器收到请求时,我希望最终结果相同:show Controller1,独立于请求 homeControllerabcdController.

为了完成这项工作,在到达 控制器之前,我需要根据 url 参数决定调用哪个控制器。但是我想尽量减少服务器和浏览器之间的请求数量。

是否可以在不提出额外请求的情况下实施?

问题编辑后,我看到很可能只需指定正确的路由即可解决此问题。

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

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

原回答

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

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

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

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

特别地,第一个方法接收控制器的名称,以及包括 RouteDataHttpContext 在内的信息(其中包含参数信息)和 returns 实例化控制器。

一般来说,这样做不是一个好主意,因为 MVC 会“按预期”停止工作,而稍后维护此项目的人将难以理解发生了什么。