Si l'itinéraire est donné:
{FeedName} / {ItemPermalink}
ex: / Blog / Hello-World
Si l'élément n'existe pas, je souhaite renvoyer un 404. Quelle est la bonne façon de procéder dans ASP.NET MVC?
asp.net
asp.net-mvc
http-status-code-404
Daniel Schaffer
la source
la source
Réponses:
Tirant de la hanche (codage cowboy ;-)), je suggère quelque chose comme ceci:
Manette:
HttpNotFoundResult:
En utilisant cette approche, vous vous conformez aux normes du cadre. Il y a déjà un HttpUnauthorizedResult là-dedans, donc cela élargirait simplement le cadre aux yeux d'un autre développeur qui maintiendrait votre code plus tard (vous savez, le psychopathe qui sait où vous habitez).
Vous pouvez utiliser réflecteur pour jeter un œil dans l'assemblage pour voir comment le HttpUnauthorizedResult est atteint, car je ne sais pas si cette approche manque quelque chose (cela semble presque trop simple).
J'ai utilisé le réflecteur pour jeter un coup d'œil à HttpUnauthorizedResult tout à l'heure. Il semble qu'ils définissent le StatusCode sur la réponse à 0x191 (401). Bien que cela fonctionne pour 401, en utilisant 404 comme nouvelle valeur, il semble que je n'obtienne qu'une page vierge dans Firefox. Internet Explorer affiche cependant un 404 par défaut (pas la version ASP.NET). En utilisant la barre d'outils du développeur Web, j'ai inspecté les en-têtes dans FF, qui affichent une réponse 404 Not Found. Peut-être simplement quelque chose que j'ai mal configuré dans FF.
Cela étant dit, je pense que l'approche de Jeff est un bel exemple de KISS. Si vous n'avez pas vraiment besoin de la verbosité de cet exemple, sa méthode fonctionne également très bien.
la source
Nous le faisons comme ça; ce code se trouve dans
BaseController
appelé comme ça
la source
la source
web.config
.Le HttpNotFoundResult est une excellente première étape vers ce que j'utilise. Renvoyer un HttpNotFoundResult est bon. Alors la question est, quelle est la prochaine étape?
J'ai créé un filtre d'action appelé HandleNotFoundAttribute qui affiche ensuite une page d'erreur 404. Puisqu'il renvoie une vue, vous pouvez créer une vue 404 spéciale par contrôleur, ou laisser est utiliser une vue 404 partagée par défaut. Cela sera même appelé lorsqu'un contrôleur n'a pas l'action spécifiée présente, car le framework lève une HttpException avec un code d'état de 404.
la source
Notez qu'à partir de MVC3, vous pouvez simplement utiliser
HttpStatusCodeResult
.la source
HttpNotFoundResult
L'utilisation d' ActionFilter est difficile à gérer car chaque fois que nous lançons une erreur, le filtre doit être défini dans l'attribut. Et si on oublie de le régler? Une façon consiste à dériver
OnException
sur le contrôleur de base. Vous devez définir unBaseController
dérivé deController
et tous vos contrôleurs doivent dériver deBaseController
. Il est recommandé d'avoir un contrôleur de base.Notez que si
Exception
le code d'état de réponse est 500, nous devons le changer en 404 pour Non trouvé et 401 pour Non autorisé. Comme je l'ai mentionné ci-dessus, utilisez lesOnException
remplacements surBaseController
pour éviter d'utiliser l'attribut de filtre.Le nouveau MVC 3 rend également plus gênant en renvoyant une vue vide au navigateur. La meilleure solution après quelques recherches est basée sur ma réponse ici Comment renvoyer une vue pour HttpNotFound () dans ASP.Net MVC 3?
Pour plus de commodité, je le colle ici:
Après quelques études. La solution de contournement pour MVC 3 ici est de tirer tous
HttpNotFoundResult
,HttpUnauthorizedResult
, lesHttpStatusCodeResult
classes et mettre en œuvre une nouvelle ( la redéfinir)HttpNotFound
méthode () dansBaseController
.Il est recommandé d'utiliser le contrôleur de base pour avoir un «contrôle» sur tous les contrôleurs dérivés.
Je crée une nouvelle
HttpStatusCodeResult
classe, non pas pour dériverActionResult
maisViewResult
pour rendre la vue ou celle queView
vous voulez en spécifiant laViewName
propriété. Je suis l'originalHttpStatusCodeResult
pour définir leHttpContext.Response.StatusCode
etHttpContext.Response.StatusDescription
puisbase.ExecuteResult(context)
je rendrai la vue appropriée car encore une fois je dériveViewResult
. Est-ce assez simple? J'espère que cela sera implémenté dans le noyau MVC.Voir mon
BaseController
ci - dessous:À utiliser dans votre action comme ceci:
Et dans _Layout.cshtml (comme la page maître)
De plus, vous pouvez utiliser une vue personnalisée comme
Error.shtml
ou créer une nouvelleNotFound.cshtml
comme j'ai commenté dans le code et vous pouvez définir un modèle de vue pour la description du statut et d'autres explications.la source