我怎样才能捕捉所有的路线来处理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" });