Comme mentionné dans l'introduction, chaque Action d'un contrôleur doit renvoyer un objet de type ActionResult. Au fur et à mesure de l'évolution du Framework, de nouveaux ActionResult sont ajoutés, souvent pour simplifier l'écriture du code. Dans la version 3 de MVC, deux nouveaux types, HttpNotFoundResult et HttpStatusCodeResult ont fait leur apparition. De plus, un des anciens types d'ActionResult, RedirectResult, a été étendu.
Ce billet fait suite à la série sur les nouveautés d'ASP.NET MVC 3 écrit conjointement avec Philippe Viallate. Vous pouvez consulter les précédents billets :
- [ASP.NET MVC] Nouveautés MVC 3 Part 1 - Améliorations dans Visual Studio 2010
- [ASP.NET MVC] Nouveautés MVC 3 Part 2 - Améliorations pour la Validation
- [ASP.NET MVC] Nouveautés MVC 3 Part 3 - Global Action FIlters
- [ASP.NET MVC] Nouveautés MVC 3 Part 4 - Meilleur support de l'injection de dépendances
- [ASP.NET MVC] Nouveautés MVC 3 Part 5 - Meilleur gestion de la génération et du rendu HTML
HttpNotFoundResult
Ce nouveau type à pour but de simplifier la gestion d'une page n'existant pas, ou un Id non valide. Imaginons que notre application MVC possède une Action View sur le contrôleur UserController, permettant de voir les détails d'un utilisateur. Si l'on veut, lorsqu'un utilisateur entre un Id qui n'est pas valide, le rediriger vers une page avec un status code de 404, on peut désormais faire :
public ActionResult View(int id) {A noter, une méthode raccourcie, HttpNotFound(), à aussi été ajoutée.
if (!UserRepository.Exists(id)) {
return new HttpNotFoundResult("Cet utilisateur n'existe pas");
}
return View(GetUserInformation(id));
}
HttpStatusCodeResult
HttpStatusCodeResult permet de gérer l'envoi, à l'utilisateur, du status code de notre choix. La gestion d'un status code spécifique est à réserver à des cas d'optimisation pour les moteurs de recherche, ou l'on va vouloir utiliser des statuts bien spécifique pour indiquer, par exemple, que la ressource n'est définitivement plus disponible.
On pourrait, par exemple, utiliser cet ActionResult pour indiquer, en fonction du contexte fonctionnel, qu'une ressource n'est plus disponible (statut 410), que l'accès à la page est interdit (code 430), ou tout autre code. Par exemple, supposons que l'on ait une action sur une page donnée permettant à l'utilisateur de récupérer son mot de passe, mais que cette action ne soit accessible que pendant un temps donné après que l'utilisateur ait demandé un nouveau mot de passe, on pourrait désormais l'implémenter ainsi :
public ActionResult GenerateNewPassword(int id) {
if (!UserRepository.Exists(id)) {
return new HttpNotFoundResult("Cet utilisateur n'existe pas");
}
var user = UserRepository.LoadById(id);
if (user.DateNewPassWordRequested < DateTime.Now.AddHours(-2))
return new HttpStatusCodeResult(410);
return View(GetUserInformation(id));
}
Redirections permanents avec RedirectResult
La classe RedirectResult possède désormais un nouveau paramètre dans son constructeur. Ce paramètre booléen permet de spécifier une redirection permanente (en termes de code de retour, on passe de 302 à 301). Pour l'utiliser directement, il nous faut faire :
public ActionResult Index(){ return new RedirectResult("http://www.developpez.com", true);}
Ceci dit, le cas général ne sera pas d'appeler directement RedirectResult, mais plutôt d'utiliser une des méthodes de redirection de la classe Controller, laquelle expose :
- RedirectPermanent : permets une redirection permanente sur une Url donnée
- RedirectToRoutePermanent: permets une redirection permanente sur une route
- RedirectToActionPermanent : permets une redirection permanente sur une Url donnée