Passage de données à des pages maîtres de vue (VB)
par Microsoft
L’objectif de ce tutoriel est d’expliquer comment passer des données d’un contrôleur à une vue master page. Nous examinons deux stratégies pour transmettre des données à une page master d’affichage. Tout d’abord, nous abordons une solution simple qui aboutit à une application difficile à gérer. Ensuite, nous examinons une solution bien meilleure qui nécessite un peu plus de travail initial, mais aboutit à une application beaucoup plus facile à gérer.
Passage de données à l’affichage des pages maîtres
L’objectif de ce tutoriel est d’expliquer comment passer des données d’un contrôleur à une vue master page. Nous examinons deux stratégies pour transmettre des données à une page master d’affichage. Tout d’abord, nous abordons une solution simple qui aboutit à une application difficile à gérer. Ensuite, nous examinons une solution bien meilleure qui nécessite un peu plus de travail initial, mais aboutit à une application beaucoup plus facile à gérer.
Le problème
Imaginez que vous créez une application de base de données de films et que vous souhaitez afficher la liste des catégories de films sur chaque page de votre application (voir figure 1). Imaginez, en outre, que la liste des catégories de films soit stockée dans une table de base de données. Dans ce cas, il est judicieux de récupérer les catégories de la base de données et d’afficher la liste des catégories de films dans une vue master page.
Figure 01 : Affichage des catégories de films dans une page d’affichage master (cliquer pour afficher l’image en taille réelle)
Voici le problème. Comment récupérer la liste des catégories de films dans la page master ? Il est tentant d’appeler directement des méthodes de vos classes de modèle dans la page master. En d’autres termes, il est tentant d’inclure le code pour récupérer les données de la base de données directement dans votre page master. Toutefois, le contournement de vos contrôleurs MVC pour accéder à la base de données violerait la séparation propre des préoccupations qui est l’un des principaux avantages de la création d’une application MVC.
Dans une application MVC, vous souhaitez que toutes les interactions entre vos vues MVC et votre modèle MVC soient gérées par vos contrôleurs MVC. Cette séparation des préoccupations aboutit à une application plus maintenable, adaptable et testable.
Dans une application MVC, toutes les données transmises à une vue, y compris une vue master page, doivent être transmises à une vue par une action de contrôleur. En outre, les données doivent être transmises en tirant parti des données d’affichage. Dans le reste de ce tutoriel, j’examine deux méthodes pour transmettre des données d’affichage à une page master d’affichage.
La solution simple
Commençons par la solution la plus simple pour passer des données d’affichage d’un contrôleur à une page d’affichage master. La solution la plus simple consiste à passer les données d’affichage de la page master dans chaque action du contrôleur.
Considérez le contrôleur dans la liste 1. Il expose deux actions nommées Index()
et Details()
. La Index()
méthode d’action retourne chaque film de la table de base de données Movies. La Details()
méthode d’action retourne chaque film d’une catégorie de film particulière.
Référencement 1 – Controllers\HomeController.vb
<HandleError()> _
Public Class HomeController
Inherits System.Web.Mvc.Controller
Private _dataContext As New MovieDataContext()
''' <summary>
''' Show list of all movies
''' </summary>
Function Index()
ViewData("categories") = From c In _dataContext.MovieCategories _
Select c
ViewData("movies") = From m In _dataContext.Movies _
Select m
Return View()
End Function
''' <summary>
''' Show list of movies in a category
''' </summary>
Function Details(ByVal id As Integer)
ViewData("categories") = From c In _dataContext.MovieCategories _
Select c
ViewData("movies") = From m In _dataContext.Movies _
Where m.CategoryId = id _
Select m
Return View()
End Function
End Class
Notez que les Index()
actions et Details()
ajoutent deux éléments pour afficher les données. L’action Index()
ajoute deux clés : les catégories et les films. La touche catégories représente la liste des catégories de films affichées par la page d’affichage master. La clé de films représente la liste des films affichés par la page d’affichage Index.
L’action Details()
ajoute également deux clés nommées catégories et films. La touche catégories, une fois de plus, représente la liste des catégories de films affichées par la page d’affichage master. La clé de films représente la liste des films d’une catégorie particulière affichée par la page d’affichage Détails (voir figure 2).
Figure 02 : Affichage Détails (cliquer pour afficher l’image en taille réelle)
La vue Index est contenue dans la liste 2. Il itère simplement dans la liste des films représentés par l’élément films dans les données d’affichage.
Référencement 2 – Views\Home\Index.aspx
<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="MvcApplication1.Index" %>
<%@ Import Namespace="MvcApplication1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<ul>
<% For Each m In ViewData("movies")%>
<li><%= m.Title %></li>
<% Next%>
</ul>
</asp:Content>
La page d’affichage master est contenue dans la liste 3. La page affichage master itère et affiche toutes les catégories de films représentées par l’élément catégories à partir des données d’affichage.
Référencement 3 – Views\Shared\Site.master
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site.Master.vb" Inherits="MvcApplication1.Site" %>
<%@ Import Namespace="MvcApplication1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title></title>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<div>
<h1>My Movie Website</h1>
<% For Each c In ViewData("categories")%>
<%=Html.ActionLink(c.Name, "Details", New With {.id = c.Id})%>
<% Next%>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</body>
</html>
Toutes les données sont transmises à l’affichage et à la vue master page via les données d’affichage. C’est la bonne façon de transmettre des données à la page master.
Alors, qu’est-ce qui ne va pas avec cette solution ? Le problème est que cette solution viole le principe DRY (Ne pas vous répéter). Chaque action du contrôleur doit ajouter la même liste de catégories de films pour afficher les données. Le fait d’avoir du code en double dans votre application rend votre application beaucoup plus difficile à gérer, à adapter et à modifier.
La bonne solution
Dans cette section, nous examinons une solution alternative, et mieux, pour passer des données d’une action de contrôleur à une vue master page. Au lieu d’ajouter les catégories de films pour la page master à chaque action du contrôleur, nous ajoutons les catégories de films aux données d’affichage une seule fois. Toutes les données d’affichage utilisées par la page d’affichage master sont ajoutées dans un contrôleur d’application.
La classe ApplicationController est contenue dans listing 4.
La classe ApplicationController est contenue dans listing 4.
Référencement 4 – Controllers\ApplicationController.vb
Public MustInherit Class ApplicationController
Inherits System.Web.Mvc.Controller
Private _dataContext As New MovieDataContext()
Public ReadOnly Property DataContext() As MovieDataContext
Get
Return _dataContext
End Get
End Property
Sub New()
ViewData("categories") = From c In DataContext.MovieCategories _
Select c
End Sub
End Class
Vous devez remarquer trois éléments concernant le contrôleur d’application dans la liste 4. Tout d’abord, notez que la classe hérite de la classe System.Web.Mvc.Controller de base. Le contrôleur d’application est une classe de contrôleur.
Ensuite, notez que la classe de contrôleur d’application est une classe MustInherit. Une classe MustInherit est une classe qui doit être implémentée par une classe concrète. Étant donné que le contrôleur d’application est une classe MustInherit, vous ne pouvez pas appeler directement des méthodes définies dans la classe. Si vous tentez d’appeler la classe Application directement, vous obtenez un message d’erreur Ressource introuvable.
Troisièmement, notez que le contrôleur d’application contient un constructeur qui ajoute la liste des catégories de films pour afficher les données. Chaque classe de contrôleur qui hérite du contrôleur d’application appelle automatiquement le constructeur du contrôleur d’application. Chaque fois que vous appelez une action sur un contrôleur qui hérite du contrôleur d’application, les catégories de films sont automatiquement incluses dans les données d’affichage.
Le contrôleur Movies de la liste 5 hérite du contrôleur d’application.
Liste 5 – Controllers\MoviesController.vb
<HandleError()> _
Public Class MoviesController
Inherits ApplicationController
''' <summary>
''' Show list of all movies
''' </summary>
Function Index()
ViewData("movies") = From m In DataContext.Movies _
Select m
Return View()
End Function
''' <summary>
''' Show list of movies in a category
''' </summary>
Function Details(ByVal id As Integer)
ViewData("movies") = From m In DataContext.Movies _
Where m.CategoryId = id _
Select m
Return View()
End Function
End Class
Le contrôleur Movies, tout comme le contrôleur d’accueil abordé dans la section précédente, expose deux méthodes d’action nommées Index()
et Details()
. Notez que la liste des catégories de films affichées par la page affichage master n’est pas ajoutée pour afficher les données dans la Index()
méthode ouDetails()
. Étant donné que le contrôleur Movies hérite du contrôleur d’application, la liste des catégories de films est ajoutée pour afficher automatiquement les données.
Notez que cette solution pour ajouter des données d’affichage pour une page de master d’affichage ne viole pas le principe DRY (Ne pas vous répéter). Le code permettant d’ajouter la liste des catégories de films pour afficher les données est contenu dans un seul emplacement : le constructeur du contrôleur d’application.
Résumé
Dans ce tutoriel, nous avons abordé deux approches pour passer des données d’affichage d’un contrôleur à une page d’affichage master. Tout d’abord, nous avons examiné une approche simple, mais difficile à maintenir. Dans la première section, nous avons expliqué comment ajouter des données d’affichage pour une vue master page dans chaque action de contrôleur dans votre application. Nous avons conclu qu’il s’agissait d’une mauvaise approche, car elle violait le principe DRY (Ne pas vous répéter).
Ensuite, nous avons examiné une stratégie bien meilleure pour ajouter des données requises par une vue master page pour afficher les données. Au lieu d’ajouter les données d’affichage dans chaque action du contrôleur, nous n’avons ajouté les données d’affichage qu’une seule fois au sein d’un contrôleur d’application. Ainsi, vous pouvez éviter le code en double lors du passage de données à une page de master d’affichage dans une application MVC ASP.NET.