108 votes

Personnalisé ASP.NET MVC Page d'Erreur 404

Je suis en train de faire un custom HTTP 404 page d'erreur lorsque quelqu'un tape dans l'URL qui n'invoquent pas d'une action valide ou le contrôleur dans ASP.NET MVC.

Au lieu de l'affichage de la Ressource générique Pas Trouvé ASP.NET erreur...

Je ne veux pas utiliser le web config pour gérer cela.

Est ce qu'il y a de routage de la magie que je peux faire pour attraper l'Url non valide?

Mise à jour: j'ai essayé la réponse donnée... cependant j'ai toujours l'laid ressource pas trouvé de message.

Une autre mise à jour OK. Apparemment, quelque chose a changé dans RC1.. j'ai même essayé spécifiquement piégeage 404 sur un HttpException et toujours il me donne juste la ressource ne trouve pas la page.

Je l'ai même utilisé mvcContrib ressources de la fonctionnalité et de rien. Même problème... des idées? S'il vous plaît avant d'aller me écrous...

100voto

Andrew Orsich Points 24503

J'ai essayé d'activer les messages d'erreurs sur le serveur de production pour 3 heures, semble j'ai trouvé la solution finale la façon de faire dans ASP.NET MVC sans routes.

Pour activer les messages d'erreurs dans ASP.NET application MVC, nous avons besoin (IIS 7+):

  1. Configurer la personnalisation des pages web de configuration sous system.web section:

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

    RemoteOnly signifie que sur le réseau local vous permettra de voir les erreurs réelles (très utile lors du développement). On peut aussi réécrire page d'erreur pour chaque code d'erreur.

  2. Jeu de magie paramètre de Réponse et le code d'état de réponse (dans la gestion d'erreur de module ou d'une erreur de la poignée de l'attribut)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    
  3. Définir une autre magie paramètre de configuration web de vertu system.webServer section:

    <httpErrors errorMode="Detailed" />
    

C'était la dernière chose que j'ai trouvé et après cela, je peux voir les messages d'erreur personnalisés sur le serveur de production.

41voto

Jack Smit Points 869

J'ai obtenu mon erreur de manipulation d'un travail par la création d'un ErrorController qui renvoie les points de vue dans cet article. J'ai également ajouté le "Catch All" de l'itinéraire global.asax.

Je ne vois pas comment il va arriver à l'une de ces pages d'erreur si elle n'est pas dans le Web.config..? Mon Web.config a dû préciser:

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

et puis, j'ai aussi ajouté:

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

Espérons que cette aide.

27voto

Yasser Points 9307

Source

NotFoundMVC - Fournit une interface conviviale page 404 à chaque fois qu'un contrôleur, de l'action ou de l'itinéraire n'est pas trouvé dans votre ASP.NET MVC3 application. Une vue appelée NotFound est rendu au lieu de la valeur par défaut ASP.NET page d'erreur.

Vous pouvez ajouter ce plugin via nuget à l'aide de: Install-Package NotFoundMvc

NotFoundMvc s'installe automatiquement lors de l'application web start-up. Il gère toutes les différentes façons dont un 404 HttpException est généralement jeté par ASP.NET MVC. Cela comprend un manque de contrôleur, de l'action et de la route.

L'étape par Étape Guide d'Installation :

1 - clic Droit sur votre Projet et Sélectionnez Gérer les Packages Nuget...

2 - Recherche d' NotFoundMvc et l'installer. enter image description here

3 - une Fois l'installation est terminée, deux fichiers seront ajoutés à votre projet. Comme indiqué dans la capture d'écran ci-dessous.

enter image description here

4 - Ouvrir le nouvellement ajouté NotFound.cshtml présents à Vue, Partagé, et de le modifier à votre gré. Maintenant, exécutez l'application et tapez une url incorrecte, et vous serez accueillis avec une interface Utilisateur conviviale pour la page d'erreur 404.

enter image description here

Pas plus, les utilisateurs reçoivent des messages d'erreur comme Server Error in '/' Application. The resource cannot be found.

Espérons que cela aide :)

P. S : Bravo à Andrew Davey pour faire un tel plugin génial.

18voto

Amila Points 798

essayez ceci dans le web.config pour remplacer IIS pages d'erreur. C'est la meilleure solution je crois, et il envoie le code d'état correct aussi.

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

Plus d'infos ici

15voto

Sujeewa Points 151

Cette solution n'a pas besoin de web.fichier de configuration des modifications ou catch-toutes les routes.

Tout d'abord, créez un contrôleur comme ceci;

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

Puis créer le point de vue sous "Vues/Erreur/Index.cshtml" comme;

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

Ensuite, ajoutez la ligne suivante dans le Global asax fichier comme ci-dessous:

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

Si vous obtenez toujours la coutume IIS page d'erreur après avoir fait cela, assurez-vous que les articles suivants sont en commentaire(ou vide) dans le fichier de configuration web:

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

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: