【问题标题】:How can I instantiate a controller manually based on a url without controller name如何根据没有控制器名称的 url 手动实例化控制器
【发布时间】:2011-12-31 17:44:10
【问题描述】:

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

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

www.domain.com/pagename

例如:

www.cnn.com/about-this-site

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

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

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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    mvc 中的一切都是基于路由的,它需要 url 中的控制器名称

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2014-05-23
      • 2014-12-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多