我打算创建一个 MasterController ,根据URL参数决定使用哪些配置。
我的第一个想法是创建一个 MasterController 。对服务器的所有请求都将被重定向到此控制器,然后,此 MasterController 将决定使用哪个控制器,并重定向到它。问题是这会产生太多的请求。
我的第二个想法是在每个控制器的开头调用一个函数,如果需要,它会重定向到正确的控制器。问题是一样的:它会增加请求的数量。
具体示例:想象一下,我有以下网址:
HTTP:\\ myapp.com \ showController1 =真
HTTP:\\ myapp.com \ ABCD showController1 =真
?
当服务器收到请求时,我希望最终结果相同:show Controller1 ,与homeController
或abcdController
的请求无关。
为了使这个工作,在到达女巫控制器之前,我需要决定在url参数上调用depenind的控制器。但我希望尽量减少服务器和浏览器之间的请求数量。
可以在不提出额外请求的情况下实现此目的吗?
答案 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会按照预期停止工作"并且稍后维护此项目的人将无法理解其中的内容上。