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