在ASP.NET MVC中返回404时创建自定义错误

问题描述:

我尝试搜索并找到了解决方案。我试过了,但是没有运气。大多数可接受的解决方案是配置您尝试过的 Web.config 文件,但它仍返回默认错误页面

I've tried to search and found some solution on it. I tried it on but no luck. Most of the accepted solution is to configure your Web.config file I tried it but it still return the default error page

<configuration>
<system.web>
<customErrors mode="On">
  <error statusCode="404"
         redirect="~/Error/Error404" />
</customErrors>
</system.web>
</configuration>

如何配置它的其他方式?

any other way on how to configure it?

我不想在IIS中对其进行配置

I don't want to configure it in IIS

此解决方案不需要更改web.config文件或

This solution doesn't need web.config file changes or catch-all routes.

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

First, create a controller like this;

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");
}
}

然后在视图/错误/索引下创建视图.cshtml as;

Then create the view under "Views/Error/Index.cshtml" as;

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

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

Then add the following in the Global asax file as below:

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错误页面,请确保以下部分在Web配置文件中被注释掉(或为空):

If you still get the custom IIS error page after doing this, make sure the following sections are commented out(or empty) in the web config file:

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