Partager via


Amélioration des méthodes Details et Delete (VB)

par Rick Anderson

Ce tutoriel vous apprend les principes de base de la création d’une application web MVC ASP.NET à l’aide de Microsoft Visual Web Developer 2010 Express Service Pack 1, qui est une version gratuite de Microsoft Visual Studio. Avant de commencer, vérifiez que vous avez installé les conditions préalables répertoriées ci-dessous. Vous pouvez les installer en cliquant sur le lien suivant : Web Platform Installer. Vous pouvez également installer individuellement les prérequis à l’aide des liens suivants :

Si vous utilisez Visual Studio 2010 au lieu de Visual Web Developer 2010, installez les prérequis en cliquant sur le lien suivant : Conditions préalables pour Visual Studio 2010.

Un projet Visual Web Developer avec VB.NET code source est disponible pour accompagner cette rubrique. Téléchargez la version VB.NET. Si vous préférez C#, basculez vers la version C# de ce didacticiel.

Dans cette partie du tutoriel, vous allez apporter des améliorations aux méthodes générées et Delete générées Details automatiquement. Ces modifications ne sont pas requises, mais avec quelques petits bits de code, vous pouvez facilement améliorer l’application.

Amélioration des méthodes Details et Delete

Lorsque vous avez généré la structure du Movie contrôleur, ASP.NET code généré par MVC qui fonctionnait très bien, mais qui peut être rendu plus robuste avec quelques petites modifications.

Ouvrez le Movie contrôleur et modifiez la Details méthode en retournant HttpNotFound lorsqu’un film est introuvable. Vous devez également modifier la Details méthode pour définir une valeur par défaut pour l’ID qui lui est passé. (Vous avez apporté des modifications similaires à la méthode dans la Edit partie 6 de ce didacticiel.) Toutefois, vous devez modifier le type de retour de la Details méthode ViewResult vers ActionResult, car la HttpNotFound méthode ne retourne pas d’objetViewResult. L’exemple suivant montre la méthode modifiée Details .

Public Function Details(Optional ByVal id As Integer = 0) As ActionResult
    Dim movie As Movie = db.Movies.Find(id)
    If movie Is Nothing Then
        Return HttpNotFound()
    End If
    Return View(movie)
End Function

Le code First facilite la recherche de données à l’aide de la Find méthode. Une fonctionnalité de sécurité importante que nous avons 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 ne vérifiez pas un film Null, cela peut entraîner une erreur de base de données.

De même, modifiez les Delete méthodes et DeleteConfirmed spécifiez une valeur par défaut pour le paramètre ID et retournez HttpNotFound lorsqu’un film n’est pas trouvé. Les méthodes mises à jour Delete dans le Movie contrôleur sont indiquées ci-dessous.

' GET: /Movies/Delete/5

 Public Function Delete(Optional ByVal id As Integer = 0) As ActionResult
     Dim movie As Movie = db.Movies.Find(id)
     If movie Is Nothing Then
         Return HttpNotFound()
     End If
     Return View(movie)
 End Function

 '
 ' POST: /Movies/Delete/5

 <HttpPost(), ActionName("Delete")>
 Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult
     Dim movie As Movie = db.Movies.Find(id)
     If movie Is Nothing Then
         Return HttpNotFound()
     End If
     db.Movies.Remove(movie)
     db.SaveChanges()
     Return RedirectToAction("Index")
 End Function

Notez que la Delete méthode ne supprime pas les données. 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 :

Public Function Delete(Optional ByVal id As Integer = 0) As ActionResult
 
 <HttpPost(), ActionName("Delete")>
 Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult

Le Common Language Runtime (CLR) nécessite des méthodes surchargées pour avoir une signature unique (même nom, liste de paramètres différente). Toutefois, ici, vous avez besoin de deux méthodes Delete ( une pour GET et une pour POST) qui nécessitent la même signature. (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 que nous avons fait 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 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 Function Delete(ByVal fcNotUsed As FormCollection, Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
    Return HttpNotFound()
End If
db.Movies.Remove(movie)
db.SaveChanges()
Return RedirectToAction("Index")
End Function

Pour résumer

Vous disposez maintenant d’une application MVC complète ASP.NET qui stocke les données dans une base de données SQL Server Compact. Vous pouvez créer, lire, mettre à jour, supprimer et rechercher des films.

Capture d’écran montrant la page Index de recherche dans l’application vidéo M V C. La page affiche une liste de quatre films.

Ce didacticiel de base vous a appris à créer des contrôleurs, à les associer à des vues et à passer des données codées en dur. Ensuite, vous avez créé et conçu un modèle de données. Entity Framework Code First a créé une base de données à partir du modèle de données à la volée, et le système de génération automatique de modèles MVC ASP.NET a généré automatiquement les méthodes d’action et les vues pour les opérations CRUD de base. Vous avez ensuite ajouté un formulaire de recherche qui permet aux utilisateurs de rechercher dans la base de données. Vous avez modifié la base de données pour inclure une nouvelle colonne de données, puis mis à jour deux pages pour créer et afficher ces nouvelles données. Vous avez ajouté la validation en marquant le modèle de données avec des attributs de l’espace DataAnnotations de noms. La validation résultante s’exécute sur le client et sur le serveur.

Si vous souhaitez déployer votre application, il est utile de tester d’abord l’application sur votre serveur IIS 7 local. Vous pouvez utiliser ce lien Web Platform Installer pour activer le paramètre IIS pour les applications ASP.NET. Consultez les liens de déploiement suivants :

Je vous encourage maintenant à passer à notre modèle de données Entity Framework pour un ASP.NET didacticiels sur l’application MVC et le magasin de musique MVC, pour explorer les articles de ASP.NET sur MSDN et consulter les nombreuses vidéos et ressources pour https://asp.net/mvc en savoir plus sur ASP.NET MVC ! Les forums ASP.NET MVC sont un endroit idéal pour poser des questions.

Vous n’avez plus qu’à l’utiliser !

— Scott Hanselman (http://hanselman.com et @shanselman sur Twitter) et Rick Anderson blogs.msdn.com/rickAndy