2

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

例如,我创建了一个映射,例如

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

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

4

2 回答 2

0

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

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

于 2008-11-25T11:13:06.450 回答
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”操作。

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

于 2008-11-25T12:28:05.550 回答