2011-11-17 72 views
1

我有一个CMS,它在数据库中存储“页面”的URL。页面有一个对模板的引用,它只是一个常规的aspx文件。使用URL重写请求被发送到正确的aspx文件。我如何基于一个URL手动实例化一个控制器,但不包含控制器名称

我们得到的MVC支持几乎完成,但有一个问题。 mvc中的所有内容都基于路由,它需要url中的控制器名称(是的,我知道你可以为没有控制器名称的url设置默认控制器,但所有页面可以有不同的控制器),这使得它很难支持以下格式的网址:

www.domain.com/pagename

例如:

www.cnn.com/about-this-site

www.cnn.com/press - 发布 - 新CEO - 宣布

pagename与控制器或视图/操作无关,它只是网页名称的一个友好的网址版本。因此,基本上我们想要做的就是取页名,找到正确的页面我们的系统,找到引用的模板(控制器在mvc中),并为该控制器和操作设置手动路由。任何想法如何做到这一点?或者应该只是接受在mvc中的URL在大多数情况下需要控制器名称?在MVC

回答

1

一切是基于路由,这在URL

这需要一个控制器名称是不正确的。是的,这是默认最简单的行为,您可以直接使用。但是路由绝不仅限于此,也不限于MVC。你可以(在你的情况,你应该)创建自定义路由处理逻辑,通过以下任一:

  • 自定义路由约束 - 让自己的自定义IRouteConstraint,你会用你的路线上处理您的内容页面上投放通过一个特定的“内容”控制器
  • 定制RouteHandler - 这是更先进的解决方案,如果你想要的东西真的很特别,但你的问题,你不

如果你计划有一个以上的“内容页面“处理控制器,并且您希望从数据库路由数据中选择它,则必须执行该操作自定义ControllerFactory - 这是在MVC堆栈决定的地方,将使用哪个控制器。有很多这样的例子,只是谷歌自定义控制器工厂。

相关问题