Examen des méthodes d’action Details et Delete
par Rick Anderson
Remarque
Une version mise à jour de ce didacticiel est disponible ici qui utilise ASP.NET MVC 5 et Visual Studio 2013. Il est plus sécurisé, beaucoup plus simple à suivre et montre plus de fonctionnalités.
Dans cette partie du tutoriel, vous allez examiner les méthodes générées et Delete
générées Details
automatiquement.
Examen des méthodes Details et Delete
Ouvrez le Movie
contrôleur et examinez la Details
méthode.
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
Le moteur de génération automatique MVC qui a créé cette méthode d’action ajoute un commentaire montrant une requête HTTP qui appelle la méthode. Dans ce cas, il s’agit d’une GET
requête avec trois segments d’URL, le Movies
contrôleur, la Details
méthode et une ID
valeur.
Le code First facilite la recherche de données à l’aide de la Find
méthode. Une fonctionnalité de sécurité importante intégrée à la méthode est que le code vérifie que la Find
méthode a trouvé un film avant que le code tente de faire quoi que ce soit avec elle. Par exemple, un pirate informatique pourrait induire des erreurs dans le site en modifiant l’URL créée par les liens, en remplaçant http://localhost:xxxx/Movies/Details/1
par quelque chose comme http://localhost:xxxx/Movies/Details/12345
(ou une autre valeur qui ne représente pas un film réel). Si vous n’avez pas vérifié un film Null, un film Null entraîne une erreur de base de données.
Examinez les méthodes Delete
et DeleteConfirmed
.
// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Movie movie = db.Movies.Find(id);
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
Notez que la HTTP Get``Delete
méthode ne supprime pas le film spécifié, elle retourne une vue du film dans laquelle vous pouvez envoyer (HttpPost
) la suppression. L’exécution d’une opération de suppression en réponse à une requête GET (ou encore l’exécution d’une opération de modification, d’une opération de création ou de toute autre opération qui modifie des données) génère une faille de sécurité.
La méthode HttpPost
qui supprime les données est nommée DeleteConfirmed
pour donner à la méthode HTTP POST une signature ou un nom unique. Les signatures des deux méthodes sont illustrées ci-dessous :
// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
Le Common Language Runtime (CLR) nécessite des méthodes surchargées pour avoir une signature à paramètre unique (même nom de méthode, mais liste de paramètres différentes). Toutefois, ici, vous avez besoin de deux méthodes Delete ( une pour GET et une pour POST) qui ont toutes les deux la même signature de paramètre. (Elles doivent toutes les deux accepter un entier unique comme paramètre.)
Pour trier cela, vous pouvez faire quelques choses. Il s’agit de donner des noms différents aux méthodes. C’est ce qu’a fait le mécanisme de génération de modèles automatique dans l’exemple précédent. Toutefois, elle présente un petit problème : ASP.NET mappe des segments d’une URL à des méthodes d’action par nom. Si vous renommez une méthode, il est probable que le routage ne pourra pas trouver cette méthode. La solution consiste à faire ce que vous voyez dans l’exemple, c’est-à-dire à ajouter l’attribut ActionName("Delete")
à la méthode DeleteConfirmed
. Cela effectue efficacement le mappage pour le système de routage afin qu’une URL incluant /Delete/for une requête POST trouve la DeleteConfirmed
méthode.
Une autre façon courante d’éviter un problème avec les méthodes qui ont des noms et des signatures identiques consiste à modifier artificiellement la signature de la méthode POST pour inclure un paramètre inutilisé. Par exemple, certains développeurs ajoutent un type de FormCollection
paramètre passé à la méthode POST, puis n’utilisent pas simplement le paramètre :
public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
Résumé
Vous disposez maintenant d’une application MVC complète ASP.NET qui stocke les données dans une base de données de base de données locale. Vous pouvez créer, lire, mettre à jour, supprimer et rechercher des films.
Étapes suivantes
Une fois que vous avez créé et testé une application web, l’étape suivante consiste à la mettre à la disposition d’autres personnes à utiliser sur Internet. Pour ce faire, vous devez le déployer sur un fournisseur d’hébergement web. Microsoft propose un hébergement web gratuit pour jusqu’à 10 sites web dans un compte d’essai Gratuit de Windows Azure. Je vous suggère ensuite de suivre mon tutoriel Déployer une application MVC sécurisée ASP.NET avec appartenance, OAuth et SQL Database sur un site web Windows Azure. Un excellent didacticiel est le niveau intermédiaire de Tom Dykstra qui crée un modèle de données Entity Framework pour une application MVC ASP.NET. Stackoverflow et les forums ASP.NET MVC sont un excellent endroit pour poser des questions. Suivez-moi sur Twitter pour obtenir des mises à jour sur mes derniers tutoriels.
Les commentaires sont bienvenus.
— Rick Anderson twitter : @RickAndMSFT
— Scott Hanselman twitter : @shanselman