【问题标题】:writing a catch all mvc route编写一条捕获所有 mvc 路由
【发布时间】:2013-01-22 00:38:33
【问题描述】:

我正在使用 MVC4 并希望编写一条路线,但不确定如何去做。

在我的网站上,我有许多路线。我想要达到的目标如下:

  • 任何与路由对应的 url,都会触发该路由的控制器操作
  • 但是,如果没有为 url 找到控制器操作,我希望触发特定的控制器操作,例如。 www.mywebsite.com/level1/level2/level3 没有对应的路由,所以我想调用一个特定的路由并将字符串列表中的 level1、level2 和 level3 作为控制器操作的参数传递给它。项目数量没有限制。

有了这些信息,我将检查数据是否存在于内容管理系统等中。

任何想法我可以如何为上述创建路线?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


    【解决方案1】:

    您的建议基本上是 404 捕获。它可能听起来并不优雅,因为它感觉像是导致错误并捕获它,但 404 只是在无法识别正确路线后采取的步骤。如果 MVC 框架有一个“Final Option”路由,它将在没有找到合适的路由后被采用。

    2 种方法

    路由方法

    • // 我们找不到处理请求的路由。显示 404 页面。 routes.MapRoute("错误", "{*url}", 新{控制器=“错误”,动作=“404”} );

    -

    -

    web.config 中的自定义错误处理程序

    <customErrors mode="On" >
           <error statusCode="404" redirect="~/CatchallController/CatchallAction" />
    </customErrors>   
    

    没有路由匹配引发的条件是 404。这样你就可以将所有不匹配的东西都指向你的~/CatchallController/CatchallAction

    |

    【讨论】:

      【解决方案2】:

      您可以在路线模式中使用星号来表示“包罗万象”(“可变长度”路线)。

      例如“{controller}/{action}/{id}/{*catchall}”

      这将匹配任何 url 与从 catchall 段开始的任意数量的段。

      记得在更一般的路线之前指定更具体的路线。

      【讨论】:

        猜你喜欢
        • 2015-12-31
        • 2011-04-29
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 2019-01-20
        相关资源
        最近更新 更多