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 :
- Conditions préalables pour Visual Studio Web Developer Express SP1
- mise à jour des outils MVC 3 ASP.NET
- SQL Server Compact 4.0(runtime + prise en charge des outils)
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.
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 :
- mappage de contenu de déploiement ASP.NET
- Activation d’IIS 7.x
- Déploiement de projets d’application web
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