如何根据没有控制器名称的URL手动实例化控制器

时间:2011-11-17 21:08:01

标签: asp.net-mvc

我有一个CMS,用于存储数据库中“页面”的URL。该页面引用了一个模板,它只是一个常规的aspx文件。使用URL重写将请求发送到正确的aspx文件。

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

www.domain.com/pagename

例如:

www.cnn.com/about-this-site

www.cnn.com/press-release-new-ceo-announced

页面名称与控制器或视图/操作无关,它只是页面名称的网址友好版本。

所以基本上我们想做的是获取页面名称,找到我们系统的正确页面,找到引用的模板(mvc中的控制器)并为该控制器和操作设置手动路由。有关如何做到这一点的任何想法?或者应该只是接受mvc中的URL在大多数情况下需要控制器名称?

1 个答案:

答案 0 :(得分:1)

  

mvc中的所有内容都基于路由,它需要url中的控制器名称

这根本不是真的。是的,这是默认最简单的行为,你可以开箱即用。但路由绝不仅限于此,也不限于MVC。您可以(并且在您的情况下应该)通过以下任何方式创建自定义路由处理逻辑:

  • 自定义路线约束 - 让自己成为自定义的IRouteConstraint,您将在路线上使用它来处理由一个特定“内容”控制器提供服务的内容页面
  • 自定义RouteHandler - 这是更高级的解决方案,如果你想要一些特别的东西,但是从你的问题来看,你没有

如果您计划拥有多个“内容页面”处理控制器,并且您希望从针对数据库的路由数据中选择它,则必须实现自定义ControllerFactory - 这是MVC堆栈决定的位置,将使用哪个控制器。有很多这方面的例子,只是google自定义控制器工厂。