ASP.NET MVC如何动态创建控制器和视图?

4
这只是一件好奇的事情,而不是我遇到的实际问题:ASP.NET MVC框架如何从RouteCollection中的字符串名称创建适当的控制器和视图对象?我尝试过查找实际的ASP.NET MVC2代码来解决这个问题,但在控制器工厂类中迷失了方向。
当我注册路由时,将第一个块映射到控制器,第二个块映射到动作,第三个块映射到ID,但程序如何使用字符串名称创建新对象?
/Users/Update/15354 = New UserController, executes Update() - how?

我想唯一可行的方法就是在项目中反射所有类,并创建一个与请求的名称相匹配的类,但是如果不知道要使用哪个命名空间,如何解决类名冲突?

如果名称冲突,ASP.NET MVC会抛出异常。 - Omar
@Omar 这并不是那么简单。只有在名称冲突且应用程序中定义的路由缺少显式命名空间时,才会抛出异常。 - Nathan Taylor
1个回答

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" }
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接