ASP.NET MVC

Transcription

ASP.NET MVC
Plan
1.  Développement
ASP.NET – ASP.NET MVC
2.  Contrôles
2.1 Contrôles élémentaires
2.2 Présentation de données
2.3 Programmation de contrôles
Lionel Seinturier
3.  MVC
Université de Lille 1
[email protected]
19/1/15
1
ASP.NET
Lionel Seinturier
ASP.NET
ASP.NET
2
Lionel Seinturier
ASP.NET
Active Server Pages (ASP)
ASP vs ASP.NET
•  du code Java embarqué dans une page HTML
•  mêmes principes JSP, PHP
•  évolution des ASP pour prendre en compte .NET
•  extension .asp (.aspx pour ASP.NET)
•  ASP : VBScript ou JScript
•  ASP: interprété/non typé
•  les fichiers .aspx sont stockés sur le serveur (comme des docs)
•  ils sont désignés par une URL
http://www.lifl.fr/prog.aspx
•  le chargement de l'URL provoque l'exécution de l'ASP côté serveur
ASP.NET : VB, C#, … ∀ langages .NET
ASP.NET : compilé/typé
ASP.NET vs JSP
1
Client
IE
Firefox
...
ASP.NET
2
Serveur
prog.aspx
•  modèle de programmation similaire
•  ++ ASP.NET = composants graphiques (contrôles)
3
4
CLR
3
ASP.NET vs servlet
.NET
•  pas d'équivalent de l'API servlet dans le monde ASP.NET
•  en interne, les ASP.NET sont traduites en classes et compilées
Lionel Seinturier
ASP.NET
4
Lionel Seinturier
1. Développement
1. Développement
Illustration du fonctionnement
Principe de fonctionnement
<%@ Page Language="c#" %>
<HTML> <BODY>
<H1>Table des factorielles</H1>
<%
int i,fact;
for ( i=1,fact=1 ; i<4 ; i++, fact*=i ) {
Response.Write( i + "! =" + fact + "<BR>" );
}
%>
</BODY> </HTML>
<%@ Page Language="c#" %>
<HTML> <BODY>
<H1>Table des factorielles</H1>
<%
int i,fact;
for ( i=1,fact=1 ; i<4 ; i++, fact*=i ) {
Response.Write( i + "! =" + fact + "<BR>" );
}
%>
</BODY> </HTML>
invocation
! 
exécution
côté serveur
ce qui est
renvoyé
au client
5
ASP.NET
Lionel Seinturier
résultat = HTML
généré via l'objet
prédéfini Response
<HTML> <BODY>
<H1>Table des factorielles</H1>
1! = 1<BR>
2! = 2<BR>
3! = 6<BR>
</BODY> </HTML>
6
ASP.NET
1. Développement
du code C#
Lionel Seinturier
1. Développement
Principe de fonctionnement
Principe de fonctionnement
•  plusieurs zones <% ... %> possibles dans une même ASP.NET
•  exécutées dans leur ordre de définition
•  une classe générée pour chaque ASP.NET
•  ne change pas tant que le fichier .aspx n'est pas modifié
•  instanciée pour traiter une requête
•  pas de persistence de l'instance (objet) entre 2 invocations
•  besoin : conserver de l'information
"  déclarer des attributs static
ASP.NET
7
Lionel Seinturier
ASP.NET
8
Lionel Seinturier
1. Développement
1. Développement
Méthodes et variables d'instance
Entre les balises <script
Exemple
runat="server">
et </script>
1ère invocation
<%@ Page Language="c#" %>
<HTML> <BODY>
<H1>Compteur</H1>
<script runat="server">
static int compteur = 0;
int GetCompteur() {
return compteur++;
}
2ème invocation
</script>
<H1> <% Response.Write(GetCpt()); %> </H1>
</BODY> </HTML>
9
ASP.NET
Lionel Seinturier
10
ASP.NET
1. Développement
1. Développement
Balise <script>
Les objets implicites
Le code peut être défini dans un fichier externe
Objets prédéclarés utilisables dans le code
<%@ Page Language="c#" %>
<HTML> <BODY>
<H1>Compteur</H1>
Request
Response
la requête qui a provoqué le chargement
la réponse à la requête de chargement
<script runat="server" src="url" />
Session
suivi de session pour un même client
<H1> <% Response.Write(GetCpt()); %> </H1>
</BODY> </HTML>
Application
espace de données partagé entre toutes les ASP.NET
idem Session
Cache
données gardées en cache par le serveur
information sur le serveur, inclusion, délégation de pages
générer des traces d'exécution
Session.Add( string name, object value )
Session[string name]
Directive Import
Server
ASP.NET
Trace
≈ using
<%@ Import Namespace = "...">
11
Lionel Seinturier
Lionel Seinturier
ASP.NET
12
Lionel Seinturier
1. Développement
1. Développement
Récupération des données d'un formulaire
Récupération des données d'un formulaire
Propriété Params de l'objet prédéfini Request
<%@ Page Language="c#" %>
<HTML> <BODY>
<H1>Exemple de résultat</H1>
Bonjour
<% Response.Write( Request.Params.Get("prenom") ); %>
<% Response.Write( Request.Params.Get("nom") ); %>
</BODY> </HTML>
!  retourne le texte saisi
!  ou null si le nom de paramètre n'existe pas
<HTML> <BODY>
<FORM ACTION="http://..."
METHOD=POST>
Nom <INPUT NAME="nom"> <P>
Prénom <INPUT NAME="prenom"> <P>
<INPUT TYPE=SUBMIT VALUE="Envoi">
<INPUT TYPE=RESET
VALUE="Remise à zéro">
</FORM>
</BODY> </HTML>
13
ASP.NET
Lionel Seinturier
clic
1. Développement
ASP.NET 4
Délégation de page
ASP.NET 5
Une page peut déléger le traitement d'une requête à une autre
!  prise en compte complète de la requête par la page déléguée
ASP.NET 1
ASP.NET
ASP.NET 2
Méthode Server.Transfer
Tout ce qui est après Transfer est ignoré
ASP.NET 3
Méthode Server.Execute
Fichier inc.aspx
<%@ Page Language="c#" %>
<HTML> <BODY>
<H1>ASP.NET principale</H1>
<%
Server.Execute(" inc.aspx ");
%>
</BODY> </HTML>
<%@ Page Language="c#" %>
<HTML> <BODY>
<H1>ASP.NET incluse</H1>
</BODY> </HTML>
<%@ Page Language="c#" %>
<HTML> <BODY>
<H1>ASP.NET principale</H1>
<%
Server.Transfer(" transf.aspx ");
%>
</BODY> </HTML>
URL
ASP.NET
Lionel Seinturier
1. Développement
Inclusion de pages
•  aggrégation des résultats fournis
par plusieurs page
!  meilleure modularité
!  meilleure réutilisation
14
ASP.NET
URL
15
Lionel Seinturier
ASP.NET
16
Lionel Seinturier
1. Développement
1. Développement
Gestion des erreurs
Exemple de gestion d'erreur
Erreur d'exécution du code
ex. : NullReferenceException, DivideByZeroException, …
<%@ Page Language="c#" %>
<HTML> <BODY>
<H1>Pourvu ... !!</H1>
<% Random r = new Random();
double h = (double)r.Next();
int hasard = (int) (h/Int32.MaxValue*5); %>
<H1> <% Response.Write(12/hasard); %> </H1>
</BODY> </HTML>
!  dans tous les cas, erreur récupérée dans le navigateur client
2 possibilités
Si hasard = 0
page d'erreur par défaut
•  conserver la page par défaut construite par le serveur Web
•  en concevoir une adaptée aux besoins particuliers de l'application
17
ASP.NET
Lionel Seinturier
ASP.NET
1. Développement
18
Lionel Seinturier
1. Développement
Exemple de gestion d'erreur
Gestion des traces
<%@ Page Language="c#"
ErrorPage="err.aspx" %>
<HTML> <BODY>
<H1>Pourvu ... !!</H1>
<% Random r = ... %>
<H1> <% ... (12/hasard) %> </H1>
</BODY> </HTML>
•  debugger
•  contrôler/inspecter le déroulement d'une appli web
!  à la main : Response.Write
: lourd, long à enlever pour passer en prod.
<%@ Page Language="c#" %>
<HTML> <BODY>
<h1>Le 0 est sorti !!</h1>
</BODY> </HTML>
Objet prédéfini Trace
System.Web.TraceContext
•  Trace.Write(string message)
•  Trace.Write(string categorie, string message)
•  Trace.Write(string categorie, string message, Exception e)
Si hasard = 0
page d'erreur err.aspx
ASP.NET
•  idem méthode Warn : les messages apparaissent en rouge dans les traces
19
Lionel Seinturier
ASP.NET
20
Lionel Seinturier
1. Développement
Activation des traces
1. Développement
Les objets prédéfinis ASP.NET
Exemple factorielle
À chaque itération :
<%@ Page Trace="true" %>
Trace.Write( "i=" + i + " / fact=" + fact );
Request
la requête qui a provoqué le chargement
System.Web.HttpRequest
.Params
les paramètres de la requêtes
.RawUrl
.FilePath
.PhysicalPath
l'URL complète
le chemin du fichier dans l'URL
le chemin ϕ du fichier sur disque
/foobar/c2/WebForm1.aspx
c:\Inetput\wwwroot\foobar\c2\WebForm1.aspx
.PhysicalApplicationPath
la racine de l'application
c:\Inetput\wwwroot\foobar\
.Headers
.UserHostName
.UserHostAddress
.UserLanguages
.Cookies
21
ASP.NET
Lionel Seinturier
les en-têtes de la requête HTTP
l'@ du client
l'IP du client
les préférences du client en terme de langues
lecture d'un cookie
22
ASP.NET
1. Développement
Lionel Seinturier
1. Développement
Les objets prédéfinis ASP.NET
Les objets prédéfinis ASP.NET
Response
Session
la réponse à une requête
System.Web.HttpResponse
gestion d'une session client
System.Web.SessionState.HttpSessionState
.ContentType
.Cache
le type MIME du contenu retourné au client (text/html, image/gif, …)
gestion de la politique de cache de la réponse (date expiration)
.SetCookie
positionnement d'un cookie chez le client
Fonctionne comme une table de hachage indicée
•  Session["key"] = object
•  object res = Session["key"]
•  object res = Session[int]
•  Session.Count
•  Session.GetEnumerator()
•  Session.Remove("key")
•  Session.RemoveAt(int)
•  Session.RemoveAll()
// null si la clé n'existe pas
le i-ème élément de la session
le # d'éléments dans la session
un itérateur sur toutes les éléments de la session
•  Session créée lors de la 1ère visite d'un client (Session.IsNewSession vaut true)
•  Session.Timeout
délai d'inactivité (en minutes) au delà duquel la session expire
ASP.NET
23
Lionel Seinturier
ASP.NET
24
Lionel Seinturier
1. Développement
1. Développement
Les objets prédéfinis ASP.NET
Les objets prédéfinis ASP.NET
Application
Cache
espace de données partagé par tous les clients
System.Web.HttpApplicationState
System.Web.Caching.Cache
Fonctionne comme une table de hachage indicée
Server
•  Application["key"] = object
•  object res = Application["key"]
•  object res = Application[int]
•  Application.Count
•  Application.GetEnumerator()
•  Application.Remove("key")
•  Application.RemoveAt(int)
•  Application.RemoveAll()
informations sur le server
System.Web.HttpServerUtility
// null si la clé n'existe pas
le i-ème élément de la session
le # d'éléments dans la session
un itérateur sur toutes les éléments de la session
25
ASP.NET
espace de données partagé par tous les clients
≠ par rapport Application : peut avoir une durée de vie limitée
Lionel Seinturier
26
ASP.NET
Plan
Lionel Seinturier
2. Contrôles
Philosophie ASP.NET
1.  Développement
Séparer
•  rendu graphique
•  traitement
2.  Contrôles
2.1 Contrôles élémentaires
2.2 Présentation de données
2.3 Programmation de contrôles
2 fichiers
•  .aspx
le code de présentation et celui des contrôles
fichier XTHML (HTML 4.0 formulé en XML)
Web form
3.  MVC
•  .aspx.cs , .aspx.vb , …
fichier dit codebehind
classe contenant les traitements
ASP.NET
27
Lionel Seinturier
ASP.NET
28
Lionel Seinturier
2. Contrôles
2. Contrôles
Les contrôles
Les contrôles existant par défaut
Composants graphiques pour l écriture de pages ASP.NET
•  toutes les balises HTML standards (<input> <img> <p> …)
•  composants supplémentaires fournis par MS (redondants avec HTML mais + évolués)
•  pour agir avec l'utilisateur
•  pour réagir aux actions de l'utilisateur
: lui présenter de l'information
: déclencher des traitements
•  affichage
•  bouton
•  saisie
•  liste
•  validation
•  divers
•  données
•  login
•  ….
•  utilisation en drag-and-drop dans VS pour la conception page web
•  analogue atelier conception IHM en client lourd
•  classe / objet
•  propriétés : les caractéristiques d'affichage (ex. Text pour un TextBox)
•  événements : réactions (clic, frappe, changement, …)
•  autant d'objets par page que de contrôles "déposés" sur la page
•  interaction avec la page ≡ interaction avec les objets
•  rendu HTML de la page à partir de l'état des objets
29
ASP.NET
: Label, Image, Panel, Tabel
: Button, Hyperlink, ImageButton, LinkButton
: TextBox, CheckBox, RadioButton, FileUpload, …
: ListBox, DropDownList, …
: CompareValidator, RequiredFieldValidator, RangeValidator, …
: Calendar
: DataList, GridView, DetailsView
+  de nouveaux contrôles peuvent être programmés par l utilisateur
Lionel Seinturier
30
ASP.NET
2.1 Contrôles élémentaires
Lionel Seinturier
2.1 Contrôles élémentaires
Exemple
Exemple
Contrôles TextBox et Button
Contrôles TextBox et Button
Fichier WebForm1.aspx
<%@ Page Language="c#" CodeFile="WebForm1.aspx.cs" Inherits="WebForm1" %>
<html>
<body>
<form id="form1" runat="server">
<asp:TextBox ID="MyTextBox" runat="server" />
<asp:Button ID="MyButton" runat="server" OnClick="MyButton_Click" />
</form>
</body>
Fichier WebForm1.aspx.cs
public partial class WebForm1 : System.Web.UI.Page {
public void MyButton_Click(object sender, System.EventArgs e) {
MyTextBox.Text = "Hello world!";
} }
demo >>
ASP.NET
31
Lionel Seinturier
ASP.NET
32
Lionel Seinturier
2.1 Contrôles élémentaires
2.1 Contrôles élémentaires
Contrôle TextBox
Association page - code
Propriétés principales
1ère solution : .aspx + codebehind + association (On…) déclarée dans .aspx
•  ID
: identificateur unique (propriété présente pour tous les contrôles)
•  Text
: le texte affiché
•  MaxLength
: taille max du texte
•  TextMode
: SingleLine | MultiLine | Password
•  ReadOnly
: false | true
•  Columns
: le nombre de colonnes
•  Rows
: le nombre de lignes (MultiLine)
•  BackColor, BorderColor, ForeColor
: couleurs
•  BorderStyle, BorderWidth, Font
: affichage
Événement principal
•  TextChanged
: le texte change
(méthode de réaction OnTextChanged)
33
ASP.NET
Lionel Seinturier
2ème solution : sans codebehind
•  définir le code des méthodes de traitements des événements dans le fichier .aspx
entre des balises <script runat="server"> et </script>
!  1 seul fichier à gérer, moins modulaire
3ème solution : .aspx + codebehind + association (On…) déclarée dans codebehind
•  ne pas utiliser l'attribut OnClick dans le fichier .aspx
•  ajouter un gestionnaire d'événement sur le bouton dans le code C#
en redéfinissant la méthode exécutée lors du chargement (OnInit)
!  couplage moins fort entre le fichier .aspx et le codebehind
!  plus difficile à manipuler, moins intuitif
34
ASP.NET
2.2 Présentation de données
Lionel Seinturier
2.2 Présentation de données
Contrôle GridView
Contrôle DataSource
•  présentation d'information sous forme de tableau
•  édition, suppression
•  pager automatique
•  tri
•  source des données à afficher
•  SqlDataSource
: un SGBD (SQL Server, …)
•  AccessDataSource : un fichier Access
•  XmlDataSource
: un fichier XML
•  ObjectDataSource : des objets (C#, VB, …)
Exemple d'utilisation
•  édition des données d'une table SQL
Définition d une SqlDataSource
•  une connection string (~ chemin d accès aux données)
•  4 commandes SQL : SELECT, INSERT, DELETE, UPDATE
!  associé à un contrôle DataSource
ASP.NET
35
Lionel Seinturier
ASP.NET
36
Lionel Seinturier
2.2 Présentation de données
2.2 Présentation de données
Exemples
Contrôle GridView
Exemple de DataSource
Propriétés principales
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="Driver={SQL Server};server=localhost;database=master"
ProviderName="System.Data.Odbc"
SelectCommand="SELECT * FROM [foo]"
DeleteCommand="DELETE FROM [foo] WHERE [nom] = ?"
InsertCommand="INSERT INTO [foo] ([nom], [age]) VALUES (?, ?)"
UpdateCommand="UPDATE [foo] SET [age] = ? WHERE [nom] = ?">
</asp:SqlDataSource>
•  ID
•  AllowPaging, AllowSorting
•  AutoGenerateColumns
•  AutoGenerateDeleteButton (idem Edit, Select)
Exemple de GridView
<asp:GridView ID="GridView1" runat="server"
DataSourceID="SqlDataSource1" DataKeyNames="nom"
AutoGenerateColumns="True"
AllowPaging="True" PageSize="4" AllowSorting="True"
AutoGenerateEditButton="true" AutoGenerateDeleteButton="true">
</asp:GridView>
demo
37
ASP.NET
•  Rows
: les lignes affichées dans le GridView
•  SelectedIndex : l'indice de la ligne sélectionnée
•  ex. utilisation : GridView1.Rows[GridView1.SelectedIndex].Cells[0].Text
•  EditIndex, PageIndex
Événements principaux
>>
Lionel Seinturier
•  RowUpdating : juste avant de mettre à voir une ligne
•  RowUpdated : après avoir mis à jour une ligne
•  idem SelectedIndexChanging/ed, Sorting/ed, RowDeleting/ed, PageIndexChanging/ed
ASP.NET
2.2 Présentation de données
38
Lionel Seinturier
2.2 Présentation de données
Contrôle DetailsView
Exemple
•  présentation sous forme de fiches
•  même action que GridView (édition, suppression)
•  action supplémentaire : ajout
•  action manquante : sélection
<asp:DetailsView ID="DetailsView1" runat="server"
DataSourceID="SqlDataSource1" DataKeyNames="nom"
AutoGenerateRows="true"
AutoGenerateEditButton="True"
AutoGenerateDeleteButton="True"
AutoGenerateInsertButton="True"
AllowPaging="True" >
</asp:DetailsView>
demo >>
ASP.NET
39
Lionel Seinturier
ASP.NET
40
Lionel Seinturier
2.3 Programmation de contrôles
2.3 Programmation de contrôles
Contrôles définis par l'utilisateur (Web User Control)
Contrôles définis par l'utilisateur
•  factorisation de code HTML et de scripts
•  fichier .ascx
<%@ Register
TagPrefix
TagName
Src
<table><tr>
<td><asp:textbox id="jour" runat="server" /></td><td>/</td>
<td><asp:textbox id="mois" runat="server" /></td><td>/</td>
<td><asp:textbox id="annee" runat="server" /></td>
préfixe XML pour le contrôle
identifiant du contrôle
URL du fichier .ascx
<%@ Register TagPrefix="foo" TagName="bar" Src="Date.ascx" %>
<%@ Page Language="c#" %>
<html><body>
<form runat="server">
<foo:bar id="JMA" runat="server" />
<asp:label id="Label" runat="server" />
<asp:button id="Button" text="Go!" runat="server" onclick="Click" />
</form>
<script language="c#" runat="server">
public string Jour {
// les propriétés du contrôle
get { return jour.Text; }
set { jour.Text=value; } }
/* idem Mois, Annee */
<script runat="server">
void Click(object sender, System.EventArgs e) {
Label.Text = JMA.Jour;
}
</script></body></html>
</script>
</tr></table>
41
ASP.NET
Lionel Seinturier
42
ASP.NET
2.3 Programmation de contrôles
Lionel Seinturier
2.3 Programmation de contrôles
Contrôles définis par
l'utilisateur
Contrôles définis par l'utilisateur
•  une classe est générée pour chaque contrôle (ex : Date_ascx)
•  instanciée lorsqu'on l'utilise
<foo:bar id="JMA" runat="server"
/>
Alternativement
•  peut être instanciée par programme
•  ajoutée dynamiquement à une page
LoadControl("Date.ascx")
<script runat="server">
void Page_Load() {
Control dt = LoadControl("Date.ascx");
((Date_ascx)dt).Jour = 12;
Frm.Controls.Add(dt);
}
</script>
clic
<form id="Frm" runat="server">
...
ASP.NET
43
Lionel Seinturier
ASP.NET
44
Lionel Seinturier
2.3 Programmation de contrôles
Plan
Autre façon de définir des contrôles utilisateur
1.  Développement
•  étendre System.Web.UI.WebControls.WebControl
•  redéfinir CreateChildControls
2.  Contrôles
2.1 Contrôles élémentaires
2.2 Présentation de données
2.3 Programmation de contrôles
Avantage
: le contrôle peut-etre défini à l'aide d'un DOM HTML
!  on ne se préoccupe pas d'écrire le code HTML
public class MyWebControl : WebControl {
protected override void CreateChildControls() {
Table tbl = new Table();
TableRow row = new tableRow();
TableCell cell = new TableCell();
TextBox box = new TextBox();
box.ID = "jour";
cell.Controls.Add(box);
row.Cells.Add(cell);
table.Rows.Add(row);
Controls.Add(table);
} }
ASP.NET
45
3.  MVC
Lionel Seinturier
ASP.NET
3. MVC
46
3. MVC
Model – View – Controller
Contrôleur
•  1978 Smalltalk Xerox PARC
•  nombreux langages et frameworks Web (Ruby on Rails, JSF, Spring, etc.)
•  reçoit les requêtes des clients
•  renvoie les réponses
•  principe de séparation des préoccupations (separation of concerns)
•  modèle, vue et contrôleur dans des domaines séparés
•  qui peuvent ou pas correspondre à des classes, méthodes, packages, etc.
•  pas de règles
•  conventions
•  contient des méthodes correspondant à des actions
•  qui sont mis en relation avec une vue
•  qui intéragissent avec le modèle
•  récupère des données dans le modèle
•  les renvoie à l'utilisateur via une vue
ASP.NET
47
Lionel Seinturier
Lionel Seinturier
ASP.NET
48
Lionel Seinturier
3. MVC
3. MVC
Contrôleur
Contrôleur
• 
• 
• 
• 
•  possibilité de déclarer des paramètres
hérite de System.Web.Mvc.Controller
suffixe Controller
une méthode par action
URL d'invocation en fonction du nom de la méthode
public class HelloWorldController : Controller {
public string Greet( string id ) {
return "Hello World "+id;
} }
public class HelloWorldController : Controller {
public string Greet() {
return "Hello World!";
} }
http://localhost:8080/helloworld/greet/Bob
•  en général les contrôleurs retournent une vue
http://localhost:8080/helloworld/greet/Bob
public ActionResult Index( int id ) {
Compte compte = db.Comptes.Find(id);
return View(compte);
}
Controller fournit le mécanisme qui reçoit/renvoie la requête HTTP
•  la décode
•  recherche la méthode à invoquer en fonction de l'URL
• 
49
ASP.NET
Lionel Seinturier
ASP.NET
3. MVC
50
3. MVC
Vue
Vue
• 
• 
• 
• 
•  Razor fournit un objet utilitaire prédéfini @Html
•  simplifie notamment la génération de formulaire d'édition de données
ASP.NET ou Razor
Razor : syntaxe HTML avec du code C# (ou VB) pour définir des vues
fichier .cshtml
HTML avec @code ou @{ ... }
@Html.ActionLink("Modifier la fiche","Edit")
// génère un lien HTML vers l'action Edit du contrôleur associé à la vue
// équivalent à <a href="/.../Edit">Modifier la fiche</a>
<ul>
@{ var hello = "Hello world at ";
var time = DateTime.Now;
var msg = hello + time; }
@for( int i=0 ; i < 10 ; i++ ) {
<li>@i</li>
}
<b>Message</b>: @msg
</ul>
@Html.BeginForm()
@Html.TextBox("Ville","valeur par défaut")
@Html.Label
@Html.ListBox
...
•  voir par exemple pour plus d'informations sur la syntaxe
•  simplifie l'écriture des pages par rapport à .aspx avec <%
ASP.NET
Lionel Seinturier
51
http://www.mikesdotnetting.com/article/184/html-helpers-for-forms-in-razor-web-pages
... %>
Lionel Seinturier
ASP.NET
52
Lionel Seinturier
3. MVC
3. MVC
Transmission de données entre contrôleur et vue
Modèle
•  object ViewBag
•  object dynamique, pas de champ prédéfini
•  champs définis en fonction des besoins
•  classe définissant les données métier de l'application
•  une propriété par donnée
•  classe additionnelle héritant de System.Data.Entity.DbContext
public class HomeController : Controller {
public ActionResult TestData() {
ViewBag.Time = DateTime.Now;
ViewBag.Foo = "Bar";
return View();
} }
using System.Data.Entity;
public class Compte {
public int Id { get; set; }
public string Titulaire { get; set; }
public double Solde { get; set; }
}
Vue
public class CompteDbContext : DbContext {
public DbSet<Compte> Comptes { get; set; }
}
<h2>TestData View</h2>
<h3>Il est : @ViewBag.Time</h3>
<h3>Foo : @ViewBag.Foo</h3>
demo >>
ASP.NET
53
Lionel Seinturier
ASP.NET
3. MVC
54
3. MVC
Modèle
Route
•  opérations courantes effectuées par les vues sur DbContext (voir Entity Framework)
•  la 4ème composante de MVC
•  permet d'aiguiller les requêtes HTTP vers un contrôleur particulier
CompteDbContext db = new CompteDbContext();
• 
db.Comptes.ToList();
•  méthode static RegisterRoute
// liste des comptes
Compte compte = db.Comptes.Find(42);
// recherche d'un compte
/App_Start/RouteConfig.cs
public class RouteConfig {
public static void RegisterRoute {
Compte compte = new { Id=42, Titulaire="Bob", Solde=123 };
db.Comptes.Add(compte);
db.SaveChanges(); // ajout d'un compte
routes.MapRoute( "Product", // nom de la route
"product/{action}/{id}",
// pattern URL
new { controller="Product", action="Index", id="" } );
Compte compte = db.Comptes.Find(42);
compte.Solde += 100;
db.SaveChanges(); // modification d'un compte
routes.MapRoute( "Default",
"{controller}/{action}/{id}",
new { controller="Home", action="Index", id="" } );
Compte compte = db.Comptes.Find(42);
db.Comptes.Remove(compte);
db.SaveChanges(); // suppression d'un compte
ASP.NET
55
Lionel Seinturier
} }
Lionel Seinturier
ASP.NET
56
Lionel Seinturier
3. MVC
3. MVC
Route
Ressources en ligne
•  alternativement directement à l'aide d'annotations sur le contrôleur
•  technique dite attribute routing
•  nombreuses …
• 
http://www.asp.net/mvc
•  tutoriel
[RoutePrefix("reviews")]
public class ReviewsController : Controller {
http://www.asp.net/mvc/overview/getting-started/
introduction/getting-started
[Route] // accès via http://...:../reviews
public ActionResult Index() {...}
•  http://www.intertech.com/Resource/UserGroup/MVCAndEF.pdf
[Route("{reviewId}")]
// /reviews/42
public ActionResult Show( int reviewId ) {...}
[Route("{reviewId}/edit")]
// /reviews/99/edit
public ActionResult Edit( int review ) {...}
}
ASP.NET
57
Lionel Seinturier
ASP.NET
58
Lionel Seinturier

Documents pareils