2011-03-01 91 views
4

这是一个好奇心,而不是我遇到的实际问题:ASP.NET MVC框架如何从RouteCollection中的字符串名称创建适当的控制器和视图对象?我已经尝试通过实际的ASP.NET MVC2代码来查找,但是在控制器工厂类中丢失了。ASP.NET MVC如何动态创建控制器和视图?

当我注册我的路线时,我将第一个块映射到控制器,第二个映射到一个动作,第三个映射到一个ID,但程序如何获取字符串名称和创建新对象?

/Users/Update/15354 = New UserController, executes Update() - how? 

我能想象工作的唯一的事情是通过在项目中的所有类反映并创建一个符合要求的名字,但你将如何解决类名冲突不知道要使用的命名空间?

+0

如果存在名称冲突,ASP.NET MVC将引发异常。 – Omar 2011-03-01 20:36:12

+0

@Omar这不是那么简单。只有在发生名称冲突并且应用程序中定义的路由缺少显式名称空间时才会抛出异常。 – 2011-03-01 20:40:31

回答

4

标准命名约定“FooController”表示所有控制器都应该有后缀“Controller”;因此,当你的当前路由指示控制器“Foo”时,ASP.NET MVC将检查应用程序中从Controller继承的类型,并查找名称与“Foo”+“Controller”匹配的类型。

假设ASP.NET MVC使用反射来查找所需的控制器是正确的,但它的影响相对较小,因为应用程序在其初始启动期间缓存了反射数据。

如果您有两个具有相同名称和不同名称空间的控制器,则可以使用MapRoute()的替代形式来指示您打算解析哪个控制器。

routes.MapRoute(
    "Error_ServiceUnavailable", 
    "error/service-unavailable", 
    new { controller = "Error", action = "ServiceUnavailable" }, 
    new[] { "Controllers" } 
); 

routes.MapRoute(
    "Admin_Error_ServiceUnavailable", 
    "admin/error/service-unavailable", 
    new { controller = "Error", action = "ServiceUnavailable" }, 
    new[] { "Areas.Admin.Controllers" } 
);