在到达控制器代码之前执行代码
Execute code before reaching the controller's code
我的意图是创建一个 MasterController,它根据 URL 参数决定使用什么配置。
我的第一个想法是创建一个 MasterController。所有对服务器的请求都将被重定向到这个控制器,然后这个 MasterController 将决定使用哪个控制器,并重定向到它。问题是这会发出太多请求。
我的第二个想法是在每个控制器的开头调用一个函数,在必要时重定向到正确的控制器。问题是一样的:它会增加请求的数量。
具体例子:假设我有以下URLs:
http:\myapp.com\?showController1=true
http:\myapp.com\abcd?showController1=true
当服务器收到请求时,我希望最终结果相同:show Controller1,独立于请求 homeController
或 abcdController
.
为了完成这项工作,在到达 控制器之前,我需要根据 url 参数决定调用哪个控制器。但是我想尽量减少服务器和浏览器之间的请求数量。
是否可以在不提出额外请求的情况下实施?
问题编辑后,我看到很可能只需指定正确的路由即可解决此问题。
路由发生在将处理请求的控制器被选择为实例之前。
路由的结果是选择一个控制器,一个动作,并从URL中获取参数。因此,指定正确的路线将允许您以非侵入方式选择正确的控制器(这是原始答案所做的)。但是,如果您将参数指定为 URL 段而不是查询字符串参数,这只会更有效。如果不是,回到原来的答案。
原回答
虽然问题不是很清楚,但看起来您想根据 URL 选择特定的控制器。这样做的一种方法是实现您自己的 IControllerFactory,并将其注册为 ASP.NET MVC 控制器工厂,如下所示:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
在实现您的自定义 MyControllerFactory
时,您必须实现此成员:
CreateController(RequestContext, String)
: 使用指定的请求上下文创建指定的控制器。
GetControllerSessionBehavior(RequestContext, String)
: 获取控制器的会话行为。
ReleaseController(IController)
: 释放指定控制器。
特别地,第一个方法接收控制器的名称,以及包括 RouteData 和 HttpContext
在内的信息(其中包含参数信息)和 returns 实例化控制器。
一般来说,这样做不是一个好主意,因为 MVC 会“按预期”停止工作,而稍后维护此项目的人将难以理解发生了什么。
我的意图是创建一个 MasterController,它根据 URL 参数决定使用什么配置。
我的第一个想法是创建一个 MasterController。所有对服务器的请求都将被重定向到这个控制器,然后这个 MasterController 将决定使用哪个控制器,并重定向到它。问题是这会发出太多请求。
我的第二个想法是在每个控制器的开头调用一个函数,在必要时重定向到正确的控制器。问题是一样的:它会增加请求的数量。
具体例子:假设我有以下URLs:
http:\myapp.com\?showController1=true
http:\myapp.com\abcd?showController1=true
当服务器收到请求时,我希望最终结果相同:show Controller1,独立于请求 homeController
或 abcdController
.
为了完成这项工作,在到达 控制器之前,我需要根据 url 参数决定调用哪个控制器。但是我想尽量减少服务器和浏览器之间的请求数量。
是否可以在不提出额外请求的情况下实施?
问题编辑后,我看到很可能只需指定正确的路由即可解决此问题。
路由发生在将处理请求的控制器被选择为实例之前。
路由的结果是选择一个控制器,一个动作,并从URL中获取参数。因此,指定正确的路线将允许您以非侵入方式选择正确的控制器(这是原始答案所做的)。但是,如果您将参数指定为 URL 段而不是查询字符串参数,这只会更有效。如果不是,回到原来的答案。
原回答
虽然问题不是很清楚,但看起来您想根据 URL 选择特定的控制器。这样做的一种方法是实现您自己的 IControllerFactory,并将其注册为 ASP.NET MVC 控制器工厂,如下所示:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
在实现您的自定义 MyControllerFactory
时,您必须实现此成员:
CreateController(RequestContext, String)
: 使用指定的请求上下文创建指定的控制器。GetControllerSessionBehavior(RequestContext, String)
: 获取控制器的会话行为。ReleaseController(IController)
: 释放指定控制器。
特别地,第一个方法接收控制器的名称,以及包括 RouteData 和 HttpContext
在内的信息(其中包含参数信息)和 returns 实例化控制器。
一般来说,这样做不是一个好主意,因为 MVC 会“按预期”停止工作,而稍后维护此项目的人将难以理解发生了什么。