在尝试让我的应用程序正确生成404错误时,我在路由表的末尾实现了一个catch all路由,如下所示:
routes.MapRoute(
"NotFound", _
"{*url}", _
New With {.controller = "Error", .action = "PageNotFound"} _
)
但是,要使其正常工作,我必须删除默认路由:
{controller}/action/{id}
但是现在已经删除了默认设置,我的大多数操作链接都不再有效,而我找到让它们再次工作的唯一方法是为每个控制器/操作添加单独的路由。
是否有更简单的方法,而不是为每个控制器/操作添加路由?
是否可以创建一个默认路由,如果用户尝试导航到未知路由,仍然允许捕获所有路由?
答案 0 :(得分:100)
在您的情况下,您应该定义默认路由{controller}/{action}/{id}
并对其进行约束。可能与控制器名称或甚至动作有关。然后把它全部放在它之后它应该可以正常工作。
因此,当有人要求资源失败时,catch-all路径将匹配请求。
因此。首先使用路径约束定义默认路由,然后在之后捕获所有路径:
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" }
);
答案 1 :(得分:18)
//this catches all requests
routes.MapRoute(
"Error",
"{*.}",
new { controller = "PublicDisplay", action = "Error404" }
);
在路由表
的末尾添加此路由答案 2 :(得分:7)
啊,问题是您的默认路由捕获所有3段网址。这里的问题是路由在我们确定谁将处理请求之前运行。因此,任何三个段URL都将匹配默认路由,即使它稍后会在没有控制器处理它的情况下结束。
您可以做的一件事是在您的控制器上覆盖HandleMissingAction方法。您还应该使用该标记来捕获所有404问题。
答案 3 :(得分:2)
嗯,我发现没有好办法做到这一点。我已将redirectMode
的{{1}}属性设置为customErrors
。
ResponseRewrite
这给了我追求的行为,但没有显示格式化的页面。
对于我来说,就SEO而言,这是做得不好。但是,我觉得有一个解决方案,我错过了,因为SO正是我想要发生的事情。 URL保留在失败的页面上并抛出404.在Firebug中检查stackoverflow.com/fail。答案 4 :(得分:1)
我建议将其作为最易读的版本。你需要在RouteConfig.cs和一个名为ErrorController.cs的控制器中,它包含一个动作' PageNotFound'。这可以返回一个视图。创建一个PageNotFound.cshtml,它将被返回以响应404:
routes.MapRoute(
name: "PageNotFound",
url: "{*url}",
defaults: new { controller = "Error", action = "PageNotFound" }
);
如何阅读:
name: "PageNotFound"
=创建一个新的路线模板,使用任意名称' PageNotFound'
url:"{*url}"
=使用此模板映射所有其他未处理的路线
defaults: new { controller = "Error", action = "PageNotFound" }
=定义错误路径将映射到的操作(错误控制器中的' PageNotFound'操作方法)。这是必需的,因为错误输入的路径显然不会映射到任何操作方法
答案 5 :(得分:0)
最好在配置部分配置404错误文档,然后恢复默认路由。
FWIW,我认为默认路线要求也被延迟了。
答案 6 :(得分:0)
我的解决方案是两个步骤。
我最初通过将此函数添加到我的Global.asax.cs文件来解决此问题:
protected void Application_Error(Object sender, EventArgs e)
我尝试将Server.GetLastError()转换为HttpException,然后检查GetHttpCode。 此解决方案详述如下:
ASP.NET MVC Custom Error Handling Application_Error Global.asax?
这不是我获得代码的原始来源。但是,这只能捕获已经路由的404错误。在我的情况下,任何2级URL。
例如,这些URL将显示404页面:www.site.com/blah
www.site.com/blah/blah
然而,www.site.com/blah/blah/blah只是说无法找到页面。 在我的所有其他路线解决了这个问题之后,在所有路线上添加你的捕获:routes.MapRoute(
"NotFound",
"{*url}",
new { controller = "Errors", action = "Http404" }
);
但是,NotFound路由似乎不会路由具有文件扩展名的请求。当它们被不同的路线捕获时,这确实有效。
答案 7 :(得分:0)
如果您正在寻找ASP.NET Core捕获所有路由并在Google上搜索asp.net core catch all route
,请点击此处: