Est-il possible de créer une route finale qui capture tous les et renvoie l'utilisateur vers une vue 404 en ASP.NET MVC ?
NOTE : Je ne veux pas configurer cela dans mes paramètres IIS.
Est-il possible de créer une route finale qui capture tous les et renvoie l'utilisateur vers une vue 404 en ASP.NET MVC ?
NOTE : Je ne veux pas configurer cela dans mes paramètres IIS.
J'ai trouvé la réponse moi-même.
Richard Dingwall a un excellent post passant en revue diverses stratégies. J'aime particulièrement la solution FilterAttribute. Je ne suis pas un fan de l'envoi d'exceptions à tort et à travers, je vais donc voir si je peux améliorer cette solution :)
Pour le global.asax, il suffit d'ajouter ce code comme dernière route pour s'enregistrer :
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "StaticContent", action = "PageNotFound" }
);
J'ai essayé, mais ça ne marche pas. J'ai placé la route sous ma route par défaut, mais j'obtiens toujours des erreurs 404.
Pouvez-vous m'expliquer ce que je dois faire exactement ? Je suis très novice en matière de MVC.
2 choses. a) ajoutez cette dernière route à votre liste de routes. b) créez un contrôleur (dans mon exemple, je l'ai appelé StaticContentController) avec une méthode Action (dans mon exemple, j'ai ajouté une méthode appelée PageNotFound(..)) ajoutez la logique de cette méthode pour afficher la page 404 non trouvée, View.
Cette question est venue en premier, mais la réponse la plus facile est venue dans une question ultérieure :
Routage pour la page d'erreur 404 personnalisée d'ASP.NET MVC
J'ai réussi à faire fonctionner ma gestion des erreurs en créant un ErrorController qui renvoie les vues de cet article. J'ai également dû ajouter la fonction "Catch All" (attraper tout) à la route dans global.asax.
Je ne vois pas comment il peut arriver à l'une de ces pages d'erreur s'il ne l'est pas. dans le Web.config ? Mon Web.config devait spécifier :
customErrors mode="On" defaultRedirect="~/Error/Unknown"
et puis j'ai aussi ajouté :
error statusCode="404" redirect="~/Error/NotFound"
J'espère que cela vous aidera.
J'aime cette méthode maintenant parce qu'elle est si simple :
<customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="~/Error/PageNotFound/" />
</customErrors>
C'est ce que j'ai maintenant, mais j'essaie de le remplacer par une meilleure solution qui n'enverra pas d'abord une réponse 302 au client mais directement une 404. Changez le redirectMode en ResponseRewrite et vous verrez que cela ne fonctionne plus... :-(
@LouisSomers Depuis cette réponse, j'ai constaté que le meilleur moyen est celui décrit dans cette question : stackoverflow.com/questions/1171035/ Je préfère ne pas rediriger l'utilisateur vers une autre URL, car cela est moins convivial (même moi, je trouve cela ennuyeux pendant le développement). Merci.
Vous pouvez également gérer l'erreur NOT FOUND dans Global.asax.cs comme suit
protected void Application_Error(object sender, EventArgs e)
{
Exception lastErrorInfo = Server.GetLastError();
Exception errorInfo = null;
bool isNotFound = false;
if (lastErrorInfo != null)
{
errorInfo = lastErrorInfo.GetBaseException();
var error = errorInfo as HttpException;
if (error != null)
isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
}
if (isNotFound)
{
Server.ClearError();
Response.Redirect("~/Error/NotFound");// Do what you need to render in view
}
}
Ajoutez ces lignes sous votre projet Root web.config File.
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
<remove statusCode="500" />
<error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
<remove name="FormsAuthentication" />
</modules>
Et si l'exception n'est pas déclenchée par une action du contrôleur ? Je lance une exception 404 dans ma fabrique de contrôleur.
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.
0 votes
Voir ma réponse à la question " stackoverflow.com/questions/619895/ ".