所有极端情况的默认路线

时间:2008-11-25 11:06:40

标签: asp.net-mvc url-routing

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

例如,我创建了一个像

这样的映射
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映射能够接受这个请求, 因为所有其他映射都失败了。但不是这样,我得到一个错误。

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

2 个答案:

答案 0 :(得分:0)

这里的问题是,路线有责任确保“一个/两个”映射到文件。这个责任属于ViewEngine。由于“一/二”是有效的路线,因此将选择它。

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

答案 1 :(得分:0)

我认为这不是最佳解决方案,但您可以在路线上更加具体:

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”操作。

缺点是必须明确创建每个控制器/操作路径。