【发布时间】:2011-11-24 04:17:07
【问题描述】:
使用 MVC3 中的 UrlHelper,您可以使用字符串为控制器和操作构建 URL:
@Url.Action("Index", "Somewhere")
这会将请求路由到SomewhereController.Index()。
我想做的是获取控制器和操作的 URL,但传递控制器的类型:
@Url.Action("Index", typeof(SomewhereController))
有没有办法做到这一点?
编辑/澄清:
我意识到控制器的约定是控制器名称路由到名为 {Name}Controller 的类,因此我可以从 Type.Name 的末尾删除“控制器”。我想我假设有一种方法可以通过一些自定义路由来覆盖这个约定。虽然我看的越多,我不确定这是否可能......
也许 MVC3 只能 路由到名为“*Controller”的类?我正在梳理 MVC3 源代码,寻找硬编码的“控制器”某处,但还没有找到答案……但如果可以将“某处”路由到类SomewhereFoo 而不是SomewhereController,那么仅仅从类名中删除“Controller”是不正确的。
如果有人可以为我提供证据支持或反对“控制器”在某处被硬编码到 MVC3 中,那么我会对“只需从名称中删除控制器”方法感到更自在。
【问题讨论】:
-
它在某处。上次我检查 ASP.NET MVC 2 源时,我找到了它。这是一个简单的字符串连接,深埋在类结构中。
-
ControllerTypeCache,由DefaultControllerFactory使用,依赖于具有以字符串结尾的前缀的控制器,只要 Controller 会从在构造缓存的键时键入名称。缓存用于根据路由值中的值查找要使用的控制器。可能还有其他地方。我不建议违反这个约定。 -
您是否在构建一些第 3 方组件之类的东西,为什么需要涵盖这样的边缘情况?即使有可能,我也想见见违反 {Name}Controller 约定的人,并批评他们使用基于约定的技术,然后违反约定!
-
@keithwarren7 :同意,遵守约定,但是是的,它是用于第 3 方插件(类似于 MvcSitemapProvder),所以我想涵盖所有我能做到的情况。 @tvanfosson:谢谢你的类名。我将在 Reflector 中打开它们并查看一下。我想我担心有人注入了不同的
ControllerFactory实现,然后把所有东西都炸了:) -
@rally25rs - 你可以在aspnet.codeplex.com查看实际来源
标签: c# asp.net .net asp.net-mvc-3