我想为500、404和403显示一个自定义错误页面。以下是我所做的:

Enabled custom errors in the web.config as follows: <customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" /> </customErrors> Registered HandleErrorAttribute as a global action filter in the FilterConfig class as follows: public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); } Created a custom error page for each of the above messages. The default one for 500 was already available out of the box. Declared in each custom error page view that the model for the page is System.Web.Mvc.HandleErrorInfo

对于500,它显示自定义错误页面。对其他人来说,则不然。

我是不是遗漏了什么?

当我阅读HandleErrorAttribute类的OnException方法中的代码时,它看起来并不是显示自定义错误的全部,而且它只处理500个。

我必须做什么来处理其他错误?


当前回答

看来我来晚了,但你最好也看看这个。

在系统中。web用于缓存应用程序中的异常,例如返回HttpNotFound()

  <system.web>
    <customErrors mode="RemoteOnly">
      <error statusCode="404" redirect="/page-not-found" />
      <error statusCode="500" redirect="/internal-server-error" />
    </customErrors>
  </system.web>

在系统中。webServer用于捕获IIS捕获的错误,而这些错误没有进入asp.net框架

 <system.webServer>
    <httpErrors errorMode="DetailedLocalOnly">
      <remove statusCode="404"/>
      <error statusCode="404" path="/page-not-found" responseMode="Redirect"/>
      <remove statusCode="500"/>
      <error statusCode="500" path="/internal-server-error" responseMode="Redirect"/>
  </system.webServer>

在最后一个例子中,如果你担心客户端响应,那么将responseMode="Redirect"更改为responseMode="File"并提供一个静态html文件,因为这个例子将显示一个响应代码为200的友好页面。

其他回答

你可以得到正确工作的错误,而不入侵global.cs,扰乱HandleErrorAttribute,做响应。TrySkipIisCustomErrors,连接Application_Error,或者别的什么:

在系统。Web(只是平常的,开/关)

<customErrors mode="On">
  <error redirect="/error/401" statusCode="401" />
  <error redirect="/error/500" statusCode="500" />
</customErrors>

在system.webServer中

<httpErrors existingResponse="PassThrough" />

现在事情的表现应该和预期的一样了,您可以使用ErrorController来显示您需要的任何东西。

我做了一些比其他解决方案需要更少的编码。

首先,在我的网里。配置,我有以下:

<customErrors mode="On" defaultRedirect="~/ErrorPage/Oops">
   <error redirect="~/ErrorPage/Oops/404" statusCode="404" />
   <error redirect="~/ErrorPage/Oops/500" statusCode="500" />
</customErrors>

控制器(/Controllers/ErrorPageController.cs)包含以下内容:

public class ErrorPageController : Controller
{
    public ActionResult Oops(int id)
    {
        Response.StatusCode = id;

        return View();
    }
}

最后,视图包含以下内容(为了简单起见,删除了内容,但它可以包含:

@{ ViewBag.Title = "Oops! Error Encountered"; } <section id="Page"> <div class="col-xs-12 well"> <table cellspacing="5" cellpadding="3" style="background-color:#fff;width:100%;" class="table-responsive"> <tbody> <tr> <td valign="top" align="left" id="tableProps"> <img width="25" height="33" src="~/Images/PageError.gif" id="pagerrorImg"> </td> <td width="360" valign="middle" align="left" id="tableProps2"> <h1 style="COLOR: black; FONT: 13pt/15pt verdana" id="errortype"><span id="errorText">@Response.Status</span></h1> </td> </tr> <tr> <td width="400" colspan="2" id="tablePropsWidth"><font style="COLOR: black; FONT: 8pt/11pt verdana">Possible causes:</font> </td> </tr> <tr> <td width="400" colspan="2" id="tablePropsWidth2"> <font style="COLOR: black; FONT: 8pt/11pt verdana" id="LID1"> <hr> <ul> <li id="list1"> <span class="infotext"> <strong>Baptist explanation: </strong>There must be sin in your life. Everyone else opened it fine.<br> </span> </li> <li> <span class="infotext"> <strong>Presbyterian explanation: </strong>It's not God's will for you to open this link.<br> </span> </li> <li> <span class="infotext"> <strong> Word of Faith explanation:</strong> You lack the faith to open this link. Your negative words have prevented you from realizing this link's fulfillment.<br> </span> </li> <li> <span class="infotext"> <strong>Charismatic explanation: </strong>Thou art loosed! Be commanded to OPEN!<br> </span> </li> <li> <span class="infotext"> <strong>Unitarian explanation:</strong> All links are equal, so if this link doesn't work for you, feel free to experiment with other links that might bring you joy and fulfillment.<br> </span> </li> <li> <span class="infotext"> <strong>Buddhist explanation:</strong> .........................<br> </span> </li> <li> <span class="infotext"> <strong>Episcopalian explanation:</strong> Are you saying you have something against homosexuals?<br> </span> </li> <li> <span class="infotext"> <strong>Christian Science explanation: </strong>There really is no link.<br> </span> </li> <li> <span class="infotext"> <strong>Atheist explanation: </strong>The only reason you think this link exists is because you needed to invent it.<br> </span> </li> <li> <span class="infotext"> <strong>Church counselor's explanation:</strong> And what did you feel when the link would not open? </span> </li> </ul> <p> <br> </p> <h2 style="font:8pt/11pt verdana; color:black" id="ietext"> <img width="16" height="16" align="top" src="~/Images/Search.gif"> HTTP @Response.StatusCode - @Response.StatusDescription <br> </h2> </font> </td> </tr> </tbody> </table> </div> </section>

就是这么简单。它可以很容易地扩展,以提供更详细的错误信息,但ELMAH为我处理,statusCode和statusDescription是我通常需要的。

在网络上。在系统下添加此配置。Webserver标签如下所示,

<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404"/>
  <remove statusCode="500"/>
  <error statusCode="404" responseMode="ExecuteURL" path="/Error/NotFound"/>
  <error statusCode="500" responseMode="ExecuteURL"path="/Error/ErrorPage"/>
</httpErrors>

并添加控制器为,

public class ErrorController : Controller
{
    //
    // GET: /Error/
    [GET("/Error/NotFound")]
    public ActionResult NotFound()
    {
        Response.StatusCode = 404;

        return View();
    }

    [GET("/Error/ErrorPage")]
    public ActionResult ErrorPage()
    {
        Response.StatusCode = 500;

        return View();
    }
}

加上他们受人尊敬的观点,我想这对所有人都肯定有效。

这个解决方案是我从《Neptune Century》中找到的

我目前的设置(在MVC3上,但我认为它仍然适用)依赖于有一个ErrorController,所以我使用:

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

控制器包含以下内容:

public class ErrorController : Controller
{
    public ViewResult Index()
    {
        return View("Error");
    }
    public ViewResult NotFound()
    {
        Response.StatusCode = 404;  //you may want to set this to 200
        return View("NotFound");
    }
}

视图就是你实现它们的方式。不过,我倾向于添加一些逻辑,以便在应用程序处于调试模式时显示堆栈跟踪和错误信息。所以错误。CSHTML看起来像这样:

@model System.Web.Mvc.HandleErrorInfo
@{
    Layout = "_Layout.cshtml";
    ViewBag.Title = "Error";
}
<div class="list-header clearfix">
    <span>Error</span>
</div>
<div class="list-sfs-holder">
    <div class="alert alert-error">
        An unexpected error has occurred. Please contact the system administrator.
    </div>
    @if (Model != null && HttpContext.Current.IsDebuggingEnabled)
    {
        <div>
            <p>
                <b>Exception:</b> @Model.Exception.Message<br />
                <b>Controller:</b> @Model.ControllerName<br />
                <b>Action:</b> @Model.ActionName
            </p>
            <div style="overflow:scroll">
                <pre>
                    @Model.Exception.StackTrace
                </pre>
            </div>
        </div>
    }
</div>

看来我来晚了,但你最好也看看这个。

在系统中。web用于缓存应用程序中的异常,例如返回HttpNotFound()

  <system.web>
    <customErrors mode="RemoteOnly">
      <error statusCode="404" redirect="/page-not-found" />
      <error statusCode="500" redirect="/internal-server-error" />
    </customErrors>
  </system.web>

在系统中。webServer用于捕获IIS捕获的错误,而这些错误没有进入asp.net框架

 <system.webServer>
    <httpErrors errorMode="DetailedLocalOnly">
      <remove statusCode="404"/>
      <error statusCode="404" path="/page-not-found" responseMode="Redirect"/>
      <remove statusCode="500"/>
      <error statusCode="500" path="/internal-server-error" responseMode="Redirect"/>
  </system.webServer>

在最后一个例子中,如果你担心客户端响应,那么将responseMode="Redirect"更改为responseMode="File"并提供一个静态html文件,因为这个例子将显示一个响应代码为200的友好页面。