ASP.NET MVC – 捕获所有路由和默认路由
在试图让我的应用程序正确地产生404错误,我已经实现了所有路由在我的路由表结束,如下所示:
routes.MapRoute( "NotFound", _ "{*url}", _ New With {.controller = "Error", .action = "PageNotFound"} _ )
但是,为了得到这个工作,我不得不删除默认路由:
{controller}/action/{id}
但是现在已经删除了默认值,我的大多数操作链接都不再工作了,而我发现重新启动它们的唯一方法是为每个控制器/操作添加单独的路由。
是否有一个简单的方法来做到这一点,而不是为每个控制器/行动添加一个路线?
如果用户尝试导航到未知路线,是否可以创build默认路线,仍然允许捕捉所有路线?
使用路线约束
在你的情况下,你应该定义你的默认路由{controller}/{action}/{id}
并在其上设置一个约束。 可能与控制器名称或甚至行动有关。 然后把所有的一个接下来,它应该工作得很好。
所以当有人请求一个约束失败的资源时,全部路由将匹配请求。
所以。 首先定义具有路由约束的默认路由,然后在其之后捕获所有路由:
routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { controller = "Home|Settings|General|..." } // this is basically a regular expression ); routes.MapRoute( "NotFound", "{*url}", new { controller = "Error", action = "PageNotFound" } );
//this catches all requests routes.MapRoute( "Error", "{*.}", new { controller = "PublicDisplay", action = "Error404" } );
在路由表的最后添加此路由
嗯,问题是你的默认路由捕获所有3段url 。 这里的问题是,路由在我们确定谁将要处理请求之前运行。 因此,任何三个网段URL都将匹配默认路由,即使稍后结束,也没有控制器来处理它。
你可以做的一件事是在你的控制器上覆盖HandleMissingAction方法。 你也应该使用标签来捕获所有的404问题。
那么,我发现,没有好办法做到这一点。 我已经将customErrors
的redirectMode
属性设置为ResponseRewrite
。
<customErrors mode="On" defaultRedirect="~/Shared/Error" redirectMode="ResponseRewrite"> <error statusCode="404" redirect="~/Shared/PageNotFound"/> </customErrors>
这给了我追求的行为,但不显示格式化的页面。
对我来说,这是做得不好,就SEO而言。 不过,我觉得有一个解决scheme,我错过了,因为这正是我想要发生的事情。 该URL保持在失败的页面上,并引发404。在Firebug中检查stackoverflow.com/fail。
我会build议这是最可读的版本。 你需要在你的RouteConfig.cs中,以及一个名为ErrorController.cs的控制器,其中包含一个“PageNotFound”动作。 这可以返回一个视图。 创build一个PageNotFound.cshtml,它将被返回以响应404:
routes.MapRoute( name: "PageNotFound", url: "{*url}", defaults: new { controller = "Error", action = "PageNotFound" } );
如何阅读:
name: "PageNotFound"
=创build一个新的路由模板,任意名称为“PageNotFound”
url:"{*url}"
=使用此模板映射所有其他未处理的路线
defaults: new { controller = "Error", action = "PageNotFound" }
=定义不正确path将映射到的操作(错误控制器中的“PageNotFound”操作方法)。 这是必要的,因为input错误的path不会显然不映射到任何操作方法
您可能最好在configuration部分configuration404错误文档,然后恢复默认路由。
FWIW,我认为默认的路由要求也是迟缓的。
我的解决scheme是2个步骤。
我最初通过将这个函数添加到我的Global.asax.cs文件解决了这个问题:
protected void Application_Error(Object sender, EventArgs e)
我尝试将Server.GetLastError()转换为HttpException,然后选中GetHttpCode。 这个解决scheme在这里详细说
ASP.NET MVC自定义error handlingApplication_Error Global.asax?
这不是我得到代码的原始来源。 但是,这只能捕获已经被路由的404错误。 在我的情况下,那个任何2级的URL。
例如,这些URL将显示404页面:
然而,www.site.com/blah/blah/blah只是简单的说找不到页面。 添加你所有的路线后,赶上所有的路线解决了这个问题:
routes.MapRoute( "NotFound", "{*url}", new { controller = "Errors", action = "Http404" } );
但是,NotFound路由似乎不能路由具有文件扩展名的请求。 当它们被不同的路线捕获时,这是行得通的。