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

我试图做一个自定义的HTTP 404错误页面,当有人input一个不调用ASP.NET MVC中的有效操作或控制器的URL,而不是显示通用的“资源未find”ASP.NET错误。

我不想用web.config来处理这个。

有没有什么types的路由魔法,我可以做到抓住任何无效的url?

更新:我试过给出的答案,但是我仍然得到丑陋的“资源未find”消息。

另一个更新:好的,RC1显然有所改变。 我甚至试过在HttpException上特意陷阱404,它仍然给我“资源未find”页面。

我甚至使用过MvcContrib的资源function,没有任何问题。 有任何想法吗?

只需在路由表的末尾添加捕获所有路由,并显示您想要的任何页面。

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

我试图在生产服务器上启用自定义错误3个小时,似乎我发现最终的解决scheme如何在ASP.NET MVC没有任何路线。

为了在ASP.NET MVC应用程序中启用自定义错误,我们需要(IIS 7+):

  1. system.web部分的web config中configuration自定义页面:

     <customErrors mode="RemoteOnly" defaultRedirect="~/error"> <error statusCode="404" redirect="~/error/Error404" /> <error statusCode="500" redirect="~/error" /> </customErrors> 

    RemoteOnly表示在本地networking上,您将看到真正的错误(在开发过程中非常有用)。 我们也可以为任何错误代码重写错误页面。

  2. 设置magic response参数和响应状态码(在error handling模块或错误句柄属性中)

      HttpContext.Current.Response.StatusCode = 500; HttpContext.Current.Response.TrySkipIisCustomErrors = true; 
  3. system.webServer部分的web config中设置另一个魔术设置:

     <httpErrors errorMode="Detailed" /> 

这是我find的最后一件事情,在此之后,我可以看到生产服务器上的自定义错误。

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

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

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

然后我还补充道:

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

希望这可以帮助。

资源

NotFoundMVC – 无论何时在ASP.NET MVC3应用程序中找不到控制器,操作或路由,都提供用户友好的404页面。 名为NotFound的视图被呈现而不是默认的ASP.NET错误页面。

你可以使用:Install-Package NotFoundMvc通过nuget添加这个插件

在Web应用程序启动过程中,NotFoundMvc自动安装。 它处理ASP.NET MVC通常抛出的404 HttpException的所有不同方式。 这包括缺less的控制器,操作和路由。

分步安装指南:

1 – 右键单击​​您的项目并selectpipe理NuGet包…

2 – searchNotFoundMvc并安装它。 在这里输入图像描述

3 – 安装完成后,两个文件将被添加到您的项目。 如下面的截图所示。

在这里输入图像描述

4 – 打开Views / Shared中新增的NotFound.cshtml,并按照自己的意愿进行修改。 现在运行该应用程序,input一个不正确的url,你将会看到一个用户友好的404页面。

在这里输入图像描述

没有更多,用户会收到错误信息,如Server Error in '/' Application. The resource cannot be found. Server Error in '/' Application. The resource cannot be found.

希望这可以帮助 :)

PS: 安德鲁Davey制作这样一个真棒插件的荣誉。

尝试在web.config中replaceIIS错误页面。 这是我猜的最好的解决scheme,它也发出了正确的状态码。

 <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" subStatusCode="-1" /> <remove statusCode="500" subStatusCode="-1" /> <error statusCode="404" path="Error404.html" responseMode="File" /> <error statusCode="500" path="Error.html" responseMode="File" /> </httpErrors> </system.webServer> 

Tipila的更多信息- 使用自定义错误页面ASP.NET MVC

此解决scheme不需要web.config文件更改或通吃路线。

首先,创build一个这样的控制器;

 public class ErrorController : Controller { public ActionResult Index() { ViewBag.Title = "Regular Error"; return View(); } public ActionResult NotFound404() { ViewBag.Title = "Error 404 - File not Found"; return View("Index"); } } 

然后在“Views / Error / Index.cshtml”下创build视图为;

  @{ Layout = "~/Views/Shared/_Layout.cshtml"; } <p>We're sorry, page you're looking for is, sadly, not here.</p> 

然后在Global asax文件中添加以下内容:

 protected void Application_Error(object sender, EventArgs e) { // Do whatever you want to do with the error //Show the custom error page... Server.ClearError(); var routeData = new RouteData(); routeData.Values["controller"] = "Error"; if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404)) { routeData.Values["action"] = "Index"; } else { // Handle 404 error and response code Response.StatusCode = 404; routeData.Values["action"] = "NotFound404"; } Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line IController errorsController = new ErrorController(); HttpContextWrapper wrapper = new HttpContextWrapper(Context); var rc = new System.Web.Routing.RequestContext(wrapper, routeData); errorsController.Execute(rc); } 

如果您在执行此操作后仍然收到自定义的IIS错误页面,请确保以下部分在Webconfiguration文件中被注释掉(或为空):

 <system.web> <customErrors mode="Off" /> </system.web> <system.webServer> <httpErrors> </httpErrors> </system.webServer> 

如果你在MVC 4工作,你可以看这个解决scheme,它为我工作。

将下面的Application_Error方法添加到我的Global.asax

 protected void Application_Error(object sender, EventArgs e) { Exception exception = Server.GetLastError(); Server.ClearError(); RouteData routeData = new RouteData(); routeData.Values.Add("controller", "Error"); routeData.Values.Add("action", "Index"); routeData.Values.Add("exception", exception); if (exception.GetType() == typeof(HttpException)) { routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode()); } else { routeData.Values.Add("statusCode", 500); } IController controller = new ErrorController(); controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); Response.End(); 

控制器本身很简单:

 public class ErrorController : Controller { public ActionResult Index(int statusCode, Exception exception) { Response.StatusCode = statusCode; return View(); } } 

在GitHub上检查Mvc4CustomErrorPage的完整源代码。

我有同样的问题,你必须做的是,而不是添加您的视图文件夹中的web.config文件中的customErrors属性,你必须将其添加到您的项目根文件夹中的web.config文件

这是真正的答案,允许在一个地方完全自定义错误页面。 无需修改web.config或创build单独的代码。

也在MVC 5中工作。

将此代码添加到控制器:

  if (bad) { Response.Clear(); Response.TrySkipIisCustomErrors = true; Response.Write(product + I(" Toodet pole")); Response.StatusCode = (int)HttpStatusCode.NotFound; //Response.ContentType = "text/html; charset=utf-8"; Response.End(); return null; } 

基于http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages