Asp.net mvc 所有极端情况下的默认路线

Asp.net mvc 所有极端情况下的默认路线,asp.net-mvc,url-routing,Asp.net Mvc,Url Routing,在我的路由中,我希望有一些类似于未找到的路由处理程序 例如,我创建了一个映射,如 routes.MapRoute( "default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id="" } ); routes.MapRoute(

在我的路由中,我希望有一些类似于未找到的路由处理程序

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

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


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

这里的问题是,确保一个/两个映射到一个文件不是路由的责任。这一责任落在ViewEngine身上。由于1/2是有效的路线,因此将选择它


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

这里的问题是,路由不负责确保一个/两个映射到一个文件。这一责任落在ViewEngine身上。由于1/2是有效的路线,因此将选择它


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

我认为这不是最好的解决方案,但您可以始终更具体地处理路由:

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


缺点是必须显式地创建每个控制器/操作路线。

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

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

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