245 votes

Comment faire pour que les pages d'erreur personnalisées fonctionnent dans ASP.NET MVC 4

Je veux une page d'erreur personnalisée montré pour 500, 404 et 403. Voici ce que j'ai fait:

1) a Permis d'erreurs personnalisées dans le web.config comme suit:

<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>

2) Inscrits HandleErrorAttribute comme une action globale de filtre dans l' FilterConfig classe comme suit:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomHandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
    }

3) a Créé une page d'erreur personnalisée pour chacun des messages ci-dessus. Celui par défaut pour les 500 était déjà disponible hors de la boîte.

4) a Déclaré dans chaque page d'erreur personnalisée de vue que le modèle de la page est - System.Web.Mvc.HandleErrorInfo

Pour 500, il affiche la page d'erreur personnalisée. Pour les autres, il ne le fait pas.

Est-il quelque chose que je suis absent?

Il ne ressemble ce n'est pas tout à affichage personnalisé des erreurs que j'ai lu à travers le code de l' OnException méthode de HandleErrorAttribute de la classe et elle est la manipulation à seulement 500.

Que dois-je faire pour gérer d'autres erreurs?

347voto

Pablo Romeo Points 5713

Mon installation actuelle (sur MVC3, mais je pense que ça s'applique toujours) s'appuie sur un ErrorController, donc j'utilise:

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

Et le contrôleur contient les éléments suivants:

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

Et le point de vue de la manière dont vous les mettre en œuvre. J'ai tendance à ajouter un peu de logique, de montrer la trace de la pile et les informations d'erreur si l'application est en mode de débogage. Donc L'Erreur.cshtml ressemble à quelque chose comme ceci:

@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>

40voto

Machinegon Points 522

J'ai fait la solution pablo et j'ai toujours eu l'erreur (MVC4)

La vue "Erreur" ou son maître n'a pas été trouvé ou aucun moteur de vue ne prend en charge l'emplacement recherché.

Pour se débarrasser de cela, supprimez la ligne

  filters.Add(new HandleErrorAttribute());
 

dans FilterConfig.cs

12voto

maxspan Points 310

Je recommanderais d'utiliser le fichier Global.asax.cs.

  protected void Application_Error(Object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    if (exception is HttpUnhandledException)
    {
        Server.Transfer("~/Error.aspx");
    }
    if (exception != null)
    {
        Server.Transfer("~/Error.aspx");
    }
    try
    {
        // This is to stop a problem where we were seeing "gibberish" in the
        // chrome and firefox browsers
        HttpApplication app = sender as HttpApplication;
        app.Response.Filter = null;
    }
    catch
    {
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X