这是一个好奇心,而不是我遇到的实际问题:ASP.NET MVC框架如何创建适当的控制器并从RouteCollection中的字符串名称查看对象?我已经尝试搜索实际的ASP.NET MVC2代码来解决这个问题,但在控制器工厂类中迷失了。
当我注册我的路线时,我将第一个块映射到控制器,第二个块映射到一个动作,第三个块映射到一个ID,但程序如何获取字符串名称并创建新对象?
/Users/Update/15354 = New UserController, executes Update() - how?
我能想象的唯一工作就是反映项目中的所有类并创建一个与所请求的名称相匹配的类,但是如何在不知道要使用哪个名称空间的情况下解决类名中的冲突?
答案 0 :(得分: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" }
);