【问题标题】:Default route for all extreme situations所有极端情况的默认路线
【发布时间】:2008-11-25 11:06:40
【问题描述】:

在我的路由中,我希望有类似未找到路由处理程序的东西。

例如,我创建了一个类似的映射

routes.MapRoute(
                     "default",
                     "{controller}/{action}/{id}",
                     new { controller = "Home", action = "Index", id="" }
             );

routes.MapRoute(
                     "Catchall",
                     "{*catchall}",
                     new { controller = "Home", action = "Lost" }
             );

但是当用户插入类似 /one/two/three/four/bla/bla 之类的地址时,它将与 Catchall 映射一起缓存。

但是当用户插入一些应该与默认映射匹配的东西时, (如 /one/two/ ,但未实现此控制器或操作) 我希望 Catchall 映射能够接受这个请求, 因为所有其他映射都失败了。但不是这个,我得到一个错误。

如果控制器或操作发生异常,我是否应该重写一些映射处理程序以捕获异常?

【问题讨论】:

    标签: asp.net-mvc url-routing


    【解决方案1】:

    这里的问题是确保“一/二”映射到文件不是路由的责任。这个责任落在了 ViewEngine 身上。由于“一/二”是一个有效的路由,它会被选中。

    如果您想处理无效路由的错误,我建议您只需使用内置的 ErrorHandling“页面”来显示您将在 Catchall 中执行的任何消息。

    【讨论】:

      【解决方案2】:

      我认为这不是最好的解决方案,但您总是可以更具体地说明您的路线:

      routes.MapRoute(
          "home and action",
          "home/index/{id}",
          new { controller = "Home", action = "Index", id="" }
      );
      

      ...重复其余的操作...

      routes.MapRoute(
          "article catch all",
          "home/{article}",
          new { controller = "Home", action = "ArticleSearcher", article="" }
      );
      

      这将尝试匹配直接操作,如果未找到操作,则将默认路由的 {action} 部分作为文章字符串参数传递给“ArticleSearcher”操作。

      缺点是必须显式创建每个控制器/动作路由。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-20
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        相关资源
        最近更新 更多