2009-06-15 6 views
15

Je crois que j'ai configuré notre application MVC pour utiliser correctement [HandleError]. Ceci est mon contrôleur:ASP.NET MVC HandleError ne fonctionne pas (customErrors est défini sur "On")

[HandleError] 
public class SupportController : BaseController { 

    public ActionResult Toss() { 
     throw new Exception("uh oh"); 
    } 
    // snip 
} 

Et je ont mis mon tag customErrors dans web.config sur "On":

<customErrors mode="On"></customErrors> 

Cependant, je reçois toujours l'écran jaune de la mort sur les exceptions. Définir un point d'arrêt dans mon action Toss() montre que HttpContext.IsCustomErrorEnabledest défini sur true.

Nous ne faisons rien avec le moteur de vue, et le BaseController ne gâche rien avec quoi que ce soit (et d'autres contrôleurs qui ne l'étendent pas ont le même problème).

Je suis en développement sur Windows XP, et j'ai le même problème lorsque l'application est déployée dans une boîte de serveur 2003 (IIS 6).

Je ne pense pas qu'il y ait une exception sur la page error.aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 

<asp:Content ID="errorContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2> 
     Sorry, an error occurred while processing your request. 
    </h2> 
</asp:Content> 

Une chose qui peut être différent est que cette application a été créée en arrière quand MVC Beta a été la dernière version, et a été mis à niveau vers la RC puis RTM comme ils ont été libérés. Peut-être y a-t-il eu un peu de réglage kooky qui reste de là?

Je peux obtenir ce travail sur d'autres applications, donc je suis un peu déconcerté.

+0

Votre page error.aspx est-elle dans ~ \ Views \ Support ou ~ \ Views \ Shared? – Talljoe

+0

~ \ Views \ Shared - même essayé [HandleError (View = "~/Views/Shared/Error.aspx")] (ne fonctionnait pas) – swilliams

Répondre

19

Cela a tendance à se produire si un problème de traitement de la page d'erreur .. si vous déboguez l'application, juste après l'exception initiale, vous rencontrerez un autre problème (exception de la page d'erreur). la raison pour moi était parce que j'avais une page maître fortement typée, la page d'erreur utilisait cette page maître, et parce que la page maître partage le même modèle que la page réelle, la page maître recevait un modèle HandlerErrorInfo, au lieu du modèle typé Je m'attendais ..

Personnellement, je pense que c'est un mauvais design dans le asp.net mvc (avec le reste de celui-ci), mais vous pouvez le contourner assez facilement en n'utilisant pas la même page maître (vous pourriez même faire l'héritage masterpage où vous avez une page maître fortement typée héritée que purement i hérite de la couche de la couche non typée ..

Sinon, il s'agit d'une sorte d'exception qui se produit dans la vue d'erreur .. (très probablement).

+1

Vous n'aviez pas 100% raison, mais vous m'avez mis sur la bonne voie . La page principale n'a pas de modèle, mais elle fait certaines choses qui étaient censées jeter une exception de référence nulle. L'utilisation d'une vue paginée non principale fonctionne. Merci! – swilliams

+1

Heureux d'aider, beaucoup de points de maux de tête dans asp.net mvc, je semble continuer à les trouver et pensé que je devrais sauver quelqu'un des actions «la tête à l'impact du clavier». :) – meandmycode

+0

Été un certain temps depuis ce poste, mais il était utile pour moi aussi bien – Craig

2

Une autre raison de ce problème peut être,

dans le modèle MVC Application (généré par VS2008/VS2008 Express), Error.aspx (généré par VS) utilise maître page.

Si Master Page accède à ViewData, il lancera une exception de référence NULL, l'erreur error.aspx ne s'affichera pas.

Utilisez ce code simple comme Error.aspx, il va résoudre le problème, (avec CustomErrors = On) Je trouve que mon problème tombe dans la catégorie générale

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 
<%= Model.Exception.Message %> 
+0

Oui, c'était le problème pour moi, merci. –

0

Après beaucoup tirer les cheveux, de "jeter l'exception du code uniquement pour lancer une autre erreur lors du rendu de la vue d'erreur."J'avais écrit une page d'erreur fortement typée en m'attendant à une exception System.Exception, puis lorsque je suis passé à l'attribut [HandleError], le filtre transmettait la page d'erreur System.HandleErrorInfo. Default.aspx.cs):.

httpHandler.ProcessRequest(HttpContext.Current); 

Confondre

1

J'ai eu un même problème, et après enquête, je l'ai trouvé que je mettais le fichier web.Debug.config sous web.config

Puis j'ai créé le. la balise CustomErrors dans le fichier web.config et il était workin g pour moi.

0

J'ai continué à rencontrer un problème similaire. J'ai été en mesure d'obtenir un résultat souhaitable avec ce "hack".

Puisque tous mes contrôleurs étendent un BaseController, cela fonctionne partout.

public class BaseController : Controller 
{ 
    protected override void OnException(ExceptionContext filterContext) 
    { 

     Response.Write("<pre>" + filterContext.Exception.StackTrace + "</pre>"); 

     base.OnException(filterContext); 

    } 

} 
3

Si vous utilisez IE9, il y a un autre problème. Il semble IE9 cacher la page d'erreur si elle est inférieure à 1 Ko, comme on dit dans:

asp-net-mvc-3-handleerror-global-filter-always-shows-iis-status-500-page

Soyez le corps est plus contenu que de longueur 1 Ko. Essayez d'ajouter ceci à la fin de la page d'erreur:

@ (new String (» », 1000))

+0

Pas seulement dans IE9. J'ai IE8 et l'expérience du même comportement. – rivarolle

1

Je suis tombé sur un problème similaire récemment. Il s'est avéré que la méthode dans le contrôleur qui lève l'exception (HomeController) était appelée par une méthode dans un contrôleur différent (DispatchController).

Nous avons dû placer la propriété [HandleError] sur le contrôleur appelant pour que cela fonctionne. Nous avons également placé la vue d'erreur personnalisée dans la structure de dossiers du contrôleur appelant.
View folder showing custom error view in the Dispatch controller folder

Questions connexes