我怎样才能捕捉所有的路线来处理404页面未find的ASP.NET MVC查询?

是否有可能创build一个捕捉所有的最终路线..并跳动用户在ASP.NET MVC中的404视图?

注意:我不想在我的IIS设置中进行设置。

自己find答案。

理查德丁沃尔有一个很好的职位,通过各种战略。 我特别喜欢FilterAttribute解决scheme。 我不喜欢在周围抛出exception,所以我会看看如果我可以改善:)

对于global.asax,只需将此代码添加为注册的最后一个路由:

routes.MapRoute( "404-PageNotFound", "{*url}", new { controller = "StaticContent", action = "PageNotFound" } ); 

这个问题首先出现了,但后面的问题更容易回答:

自定义ASP.NET MVC 404错误页面的路由

我得到了我的error handling工作,通过创build一个返回本文中的视图的ErrorController。 我还必须在global.asax中添加“Catch All”。

如果它不在Web.config中,我看不到这些错误页面中的任何一个。 我的Web.config必须指定:

 customErrors mode="On" defaultRedirect="~/Error/Unknown" 

然后我还补充道:

 error statusCode="404" redirect="~/Error/NotFound" 

希望这可以帮助。

现在我喜欢这种方式,因为它非常简单:

  <customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect"> <error statusCode="404" redirect="~/Error/PageNotFound/" /> </customErrors> 

这可能是您使用时的一个问题

 throw new HttpException(404); 

当你想抓住这个,我不知道任何其他方式,然后编辑你的网页configuration。

您也可以在Global.asax.cs中处理NOT FOUND错误,如下所示

 protected void Application_Error(object sender, EventArgs e) { Exception lastErrorInfo = Server.GetLastError(); Exception errorInfo = null; bool isNotFound = false; if (lastErrorInfo != null) { errorInfo = lastErrorInfo.GetBaseException(); var error = errorInfo as HttpException; if (error != null) isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound; } if (isNotFound) { Server.ClearError(); Response.Redirect("~/Error/NotFound");// Do what you need to render in view } } 

在您的项目根目录web.config文件下添加这行。

  <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" /> <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" /> <remove statusCode="500" /> <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" /> </httpErrors> <modules> <remove name="FormsAuthentication" /> </modules> 

创build一条全path的另一种方法是将一个Application_EndRequest方法添加到您的MvcApplication每Marco's Better-than-Unicorns MVC 404 Answer 。

如果路由无法parsing,那么MVC框架将通过404错误。最好的办法是使用exceptionfilter…创build一个自定义的exceptionfilter,并像这样做..

 public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html"); } } 

RouterConfig.cs里面添加如下的代码片段:

  routes.MapRoute( name: "Error", url: "{id}", defaults: new { controller = "Error", action = "PageNotFound" });