ASP.NET MVC Framework - en del af ASP.NET 3.5 Extensions



Relaterede dokumenter
Tjek den nye ASP.NET-platform - ASP.NET Model View Controller (MVC) Framework

Umbraco installationsvejledning

ASP.NET MVC En Dansk e-bog.

Tredjepart webservices

Procesbeskrivelse - Webprogrammering

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

Kom i gang med SAS STPbaserede

DM507 Algoritmer og datastrukturer

Sådan kan du sende data fra din egen hjemmeside til JitBesked via en HTML-JDF.

Dokumentation. Udbyder : sms1919.dk Service : sms-grupper Static FBML Facebook. : Facebook Integration med sms-grupper.

Databaseadgang fra Java

Web- og serverprogrammering

Plotning og MicroStation V8i. Frank Møller Christensen

Software Construction 1 semester (SWC) Spørgsmål 1

DM507 Algoritmer og datastrukturer

Vejledning til Retsinformation web services test stubs

Udvikling af DOTNET applikationer til MicroStation i C#

1 Domæne Design valg User Klassediagran 5

My booking. Generelt. Forsiden. Version 9.0

PHP Snippets. De små korte. Skrevet af Daniel Pedersen

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

Brugervejledning til Design Manager Version 1.02

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere

Arkitektur for begyndere

Affaldsdatasystem Vejledning supplement i system-til-system integration for.net brugere

PHP kode til hjemmeside menu.

Ressourcekatalog. Christian Glantz. Kongens Lyngby 2010 IMM-B.Eng

Eksempel: et ordresystem note 5 Lagdeling s. 1

Adgang til kundeportalen

EasyIQ Opdatering > 5.4.0

MapBasic &.NET interaktion. MapBasic.NET. Jakob Lanstorp IT konsulent COWI. Odense 23. Juni jun 2011 MapBasic &.

FMK-online's brug af SmartFraming

ADMINISTRATIONS MANUAL

PID2000 Archive Service

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

Et subsite i Umbraco

Interaktionsudvikling

Who s to blame? Jeppe Rørbæk. Jeppe.rorbaek@teknologisk.dk Konsulent og underviser på Teknologisk Institut MCP, MCAD, MCSD, MCT

Dygtig.NET / C# udvikler med stor erfaring fra både offentlige organisationer og private virksomheder.

Arkitektur principper og design mønstre til realisering af enterprise applikationer baseret på rige domænemodeller (og.net)

Ugeseddel 4 1. marts - 8. marts

Kursusarbejde 3 Grundlæggende Programmering

Systemair Connect. Opsætning

2. Systemarkitektur... 2

Web sider. Introduktion: Har du nogensinde spekuleret over, hvordan det verdesomspændende internet virker og hvordan man snakker med det?

Videregående programmering i Java

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Vejledning til Teknisk opsætning

GRAFISK PRODUKTION & WORKFLOW. Endotest website

SOSIGW. - Administrationskonsol for SOSIGW Indeks

FLIS PORTAL GENNEMGANG OG STIKPRØVER (SEPTEMBER 2015)

2. SEMESTER PROJEKT 3 INTERAKTIONSUDVIKLING

Byggebasen Javascript

Studieordning del

Opstart. I gang med Dreamweaver. Læs mere om...

Den Danske Esri Brugerkonference 2019 What's new in ArcGIS Enterprise og Administration af ArcGIS Enterprise

Advanced Word Template Brugermanual

Anvendelse af Model- View koncept i SAS Stored Processer

SWC eksamens-spørgsmål. Oversigt

Installation og Drift. Aplanner for Windows Systemer Version 8.15

Eksamens spørgsmål Software Construction. Objekter. Spørgsmål 1: Januar Giv en beskrivelse af Objekt-begrebet og deres brug

vejman.dk WMS/WFS dokumentation vmgeoserver.vd.dk Maj 2013 Udgave 2.0

Administration af subsites BRUGERVEJLEDNING FOR ADMINISTRATOREN

Transkript:

ASP.NET MVC Framework - en del af ASP.NET 3.5 Extensions Captator Tlf: 8620 4242 www.captator.dk Carsten Juel Andersen Softwarearkitekt juel@captator.dk Mobil: 2348 0003 februar 2008 ASP.NET MVC Framework 1

Agenda MVC overblik Hvorfor?, Hvad?, Hvordan? Fra Controller, over Model til View Sammenhængen mellem Controller, Model og View URL routing Fleksibel og generel URL routing Håndtering af view data Hvordan flyttes data fra Controller til View Redigering af data Håndtering af Form redigering og postbacks februar 2008 ASP.NET MVC Framework 2

Disclamer Dette foredrag er (stort set) forældet inden I kommer hjem Dette foredrag bygger på ASP.NET 3.5 Extensions Preview af 9. dec 2007 MVC Toolkit ADO.NET Entity Framework beta 3 Nyt preview i forbindelse med MIX08 (5. - 7. marts) Efter MIX08 releasen vil der formentlig komme en række CTP er frem mod den endelige release Se Scott Gu s blog (weblogs.asp.net/scottgu) med titlen: ASP.NET MVC Framework Road-Map Update Men mon ikke koncepterne forbliver nogenlunde som de er på nuværende tidspunkt?! februar 2008 ASP.NET MVC Framework 3

ASP.NET web forms ASP.NET web forms bygger på en Windows forms - weboplevelse bygger på en form per side bygger på event mekanisme bygger på et kontroltræ, hvor kontroller har navn efter, hvor i træet de er placeret benytter ViewState er i modsætning til traditionel web udvikling, hvor siden ofte vil indeholde en form for hver inputformular på siden De fleste public websites har kun et fåtal af sider, hvor alt dette er nødvendigt Det er svært at skille især kontrol- og user interfacelogik februar 2008 ASP.NET MVC Framework 4

MVC framework overblik Mål med Model View Controller frameworket At sikre en klar adskillelse mellem model, view, controller Model Model / entitetsobjekter / forretningsobjekter indeholder applikationens tilstand og persisteres ofte i eksempelvis en database View Ansvarlig for at displaye brugergrænsefladen Controller Håndterer brugerens input, manipulerer modellen og udvælger et view således at den næste side kan vises i brugergrænsefladen februar 2008 ASP.NET MVC Framework 5

MVC framework design principper Klar adskillelse af ansvar (model, view, controller) Optimeret for TDD baseret udvikling Test Driven Development (test-først programmering) Extensible / pluggable URL-mapping komponent, der giver mulighed for pæne og gennemskuelige URL er Eksisterende masterpages, web forms og userkontroller kan benyttes som view komponenter Postback-delen af disse kan ikke benyttes! Understøtter derudover alt ikke-ui baseret i ASP.NET Caching, URL autorisering, session handling etc. februar 2008 ASP.NET MVC Framework 6

Overblik over MVC demoen Time- og projektregistereringsapplikation Medarbejdere (Employee) kan registrere udførte opgaver (WorkRegistration) på givne projekter (Project) Man kan kun registrere på et givet projekt, hvis man har tilladelse (WorkAllowance) til at arbejde på projektet For hvert projekt er der en diskussionsliste. En medarbejder kan oprette et nyt eller besvare et tidligere indlæg (ProjectDiscussionEntry) februar 2008 ASP.NET MVC Framework 7

Overblik over den første MVC demo I første omgang vil vi se på Medarbejderliste Liste over den enkelte medarbejders registreringer Detaljevisning af registrering februar 2008 ASP.NET MVC Framework 8

Folderstruktur af ASP.NET MVC Applikation Der er 3 hovedmapper Controllers Som udgangspunkt er der en klasse for hver controller Models En eller flere modeller - f.eks. ved brug af LINQ to SQL eller LINQ to Entities Views Anbefaling: Placer model og modelhjælpeklasser i et selvstændigt projekt Undermapper for hver controller Shared indeholder fælles views februar 2008 ASP.NET MVC Framework 9

Eksekveringsrækkefølge Først routes URLen til den matchende controller Controlleren trækker view data ud af modellen Ud fra request parametrene View data sendes til viewet Default.aspx (View) url RegistrationController (Controller) view data Employee.aspx (View) Details.aspx (View) Model februar 2008 ASP.NET MVC Framework 10

RegistrationController Controller navn = klassenavn, dog uden Controller Actions er metoder på controllerklassen namespace MvcApplication.Controllers public class RegistrationsController : Controller [ControllerAction] public void Employees() [ControllerAction] public void Employee(string initials) URL = /Registrations/Employee/cja Controller navn = Registrations Action navn = Employees URL = /Registrations/Employees [ControllerAction] public void Details(System.Guid id) URL = /Registrations/Details/fdf2b7e4-0f9b-4c5b-ac37-27d5f3105ab3 februar 2008 ASP.NET MVC Framework 11

RegistrationController - parametre En input parameter kan mappes til en variabel i en action metode på forskellig vis [ControllerAction] public void Details() System.Guid id = new System.Guid(Request["id"]); URL = /Registrations/Details?id=fdf2b7e4-0f9b-4c5b-ac37-27d5f3105ab3 [ControllerAction] public void Details(System.Guid id) URL = /Registrations/Details?id=fdf2b7e4-0f9b-4c5b-ac37-27d5f3105ab3 [ControllerAction] public void Details(System.Guid id) URL = /Registrations/Details/fdf2b7e4-0f9b-4c5b-ac37-27d5f3105ab3 februar 2008 ASP.NET MVC Framework 12

Modellen Entitetsmodel genereret ud fra databasen februar 2008 ASP.NET MVC Framework 13

En komplet action metode Nu kan vi i action metoder hente data fra controlleren sende data videre til et view namespace MvcApplication.Controllers public class RegistrationsController : Controller [ControllerAction] public void Employees() EmployeeList employees = null; Anbefaling: Flyt tilgang til model (inklusive LINQ-queries) til klasser i Model -namespacet using (Model.Context context = new Model.Context()) employees = new EmployeeList(context.Employee.ToList<Employee>()); RenderView("Default", employees); februar 2008 ASP.NET MVC Framework 14

Viewet Benyt masterpages,.aspx og.ascx MVC frameworket ligger op til at holde html-koden så simpel som muligt Et view må kun have renderingslogik! Der benyttes følgende superklasser Masterpage.aspx.ascx System.Web.Mvc.ViewMasterPage System.Web.Mvc.ViewPage System.Web.Mvc.ViewUserControl februar 2008 ASP.NET MVC Framework 15

Viewet View placeres under Views mappen Opret undermappe for hver controller (samme navn som controlleren) Placer delte filer i Shared Når controller kalder RenderView Vælges view i undermappe med samme navn som controller, findes den ikke her vælges view fra Shared Dette er en out of the box sammenkædning mellem controller og view Det er muligt at plugge sin egen håndtering af dette ind i frameworket februar 2008 ASP.NET MVC Framework 16

View Viewet kaldes fra RegistrationsController [ControllerAction] public void Employees()... RenderView("Default", employees); Brug den generiske version af ViewPage til at angive typen for view data og få typestærk adgang der til public partial class Default : ViewPage<EmployeeList> public void Page_Load() ViewData[0]. februar 2008 ASP.NET MVC Framework 17

Rendering af viewet 2 forskellige principper for rendering 1. via inline code Fordel: Typestærk adgang til view data Ulempe: Serverside kode og HTML rodet sammen 2. via code behind og ASP.NET kontroller Fordel: Serverside kode og HTML adskilt Ulempe: Databinding er typesvag Referencer til andre sider indsættes via htmlhjælpemetoder, således at der ikke er hardkodede links på siden februar 2008 ASP.NET MVC Framework 18

Rendering af View via inline code @ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"... <asp:content ID="Content2" ContentPlaceHolderID="Main... <ul> foreach (Model1.Employee emp in ViewData) <li> = Html.ActionLink(emp.Firstname + " " + emp.lastname, new Controller = "Registrations", Action = "Employee/" + emp.initials ) </li> </ul> <asp:content> public partial class Default : ViewPage<EmployeeList> februar 2008 ASP.NET MVC Framework 19

View output Output er simpel html uden <form> tags Ingen lange WebForms ID er... <div id="maincontent"> <h2>timeregistrering</h2> <h3>ansatte:</h3> <ul> <li><a href="/registrations/employee/pla">peter Lauridsen</a></li> <li><a href="/registrations/employee/esv">erik Svendsen</a></li> <li><a href="/registrations/employee/moj">morten Jensen</a></li> <li><a href="/registrations/employee/hla">henriette Larsen</a></li> <li><a href="/registrations/employee/cja">carsten Juel Andersen</a></li> </ul> </div>... februar 2008 ASP.NET MVC Framework 20

Rendering af view via code behind aspx med brug af Repeater @ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"... <asp:content ID="Content2" ContentPlaceHolderID="Main... <asp:repeater ID="repViewEmployees" runat="server" OnItemDataBound="repViewEmployees_ItemDataBound"> <HeaderTemplate> <ul> </HeaderTemplate> <ItemTemplate> <li> <asp:literal ID="litLink" runat="server" /> </li> </ItemTemplate> <FooterTemplate> </ul> </FooterTemplate> </asp:repeater> </asp:content> februar 2008 ASP.NET MVC Framework 21

Rendering af view via code behind... og den tilsvarende codebehind public partial class Default : ViewPage<EmployeeList> public void Page_Load() repviewemployees.datasource = ViewData; repviewemployees.databind(); protected void repviewemployees_itemdatabound( object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e) if ((e.item.itemtype == ListItemType.Item) (e.item.itemtype == ListItemType.Item) ) System.Web.UI.WebControls.Literal litlink = (System.Web.UI.WebControls.Literal)FindControl("litLink"); Employee emp = (Employee)e.Item.DataItem; litlink.text = Html.ActionLink( emp.firstname + " " + emp.lastname, new Controller = "Registrations", Action = "Employee/" + emp.initials ); februar 2008 ASP.NET MVC Framework 22

Html.ActionLink helper metode HtmlHelper er del af MVCToolkit HtmlHelper kan tilgåes i Views via Html property ActionLink benytter den opsatte routing af controllere og actions til at skabe et link herudfra Eksempler på brug Kald parameterløs action på den kaldende controller Html.ActionLink("linktekst", "actionname"); Kald vilkårlig controller og action evt. med parametre Her benyttes en overload med en anonym klasse Html.ActionLink("linktekst", new Controller = "Registrations", Action = "Employee", Initials = "cja" ); februar 2008 ASP.NET MVC Framework 23

Anden MVC demo URL routing MVC indeholder en fleksibel URL routing mekanisme RouteTable (liste af routing regler) opbygges ved applikationens opstart Når et request modtages sendes det gennem routing systemet Hvis der findes et match kaldes den matchende controller, ellers fejler requestet url RouteTable Controller Controller Employee Controller Action Employee Controller Action Employee Controller Action Employee RegistrationController Action Employee Action februar 2008 ASP.NET MVC Framework 24

URL routing Default placering for opsætning af routing er i Global.asax.cs public class Global : System.Web.HttpApplication protected void Application_Start(object sender, EventArgs e) RouteTable.Routes.Add(new Route Url = "[controller]/[action]/[id]", Defaults = new action = "Index", id = (string)null, RouteHandler = typeof(mvcroutehandler) ); RouteTable.Routes.Add(new Route Url = "Default.aspx", Defaults = new controller = "Home", action = "Index", id = (string)null, RouteHandler = typeof(mvcroutehandler) ); februar 2008 ASP.NET MVC Framework 25

URL routing Url specifikation En Url specifikation kan være en eksakt Url en templated Url eller en kombination Url = "Min/Side" Url = "[controller]/[action]/[id]" Url = "Min/[action]/[controller]" En Route skal kunne fastlægge controller og action ved at [controller] og [action] indgår i URL eller ved at controller og action defineres som Defaults RouteTable.Routes.Add(new Route Url = "Min/Side", Defaults = new controller = "MinController", action = "Side" ), RouteHandler = typeof(mvcroutehandler) ); februar 2008 ASP.NET MVC Framework 26

URL routing Url specifikation Templated Url Url = "[controller]/[action]/[id]" "[tekst]" angiver en parameter Ovenstående vil blandt andet matche følgende /Home/Default Hvis der findes en HomeController med en Default action og en default værdi for id der er null /Registration/Employee/20 Hvis der findes en HomeController med en Employee action februar 2008 ASP.NET MVC Framework 27

URL routing fra Route til Controller (1) Med følgende Route og Url new Route Url = "[controller]/[action]/[id]", Defaults = new action = "Index", id = (string)null, RouteHandler = typeof(mvcroutehandler) ); /Registration/Employee/20 Vil Route skabe et RouteData objekt public class RouteData public RouteData(); public Route Route get; set; public IDictionary<string, object> Values get; Med en IDictionary indeholdende "Controller" = "Registration" "Action" = "Employee" "Id" = 20 februar 2008 ASP.NET MVC Framework 28

URL routing fra Route til Controller (2) RequestContext sendes til en RouteHandler public class RequestContext public RequestContext(IHttpContext httpcontext, RouteData routedata); public IHttpContext HttpContext get; internal set; public RouteData RouteData get; internal set; public interface IRouteHandler IHttpHandler GetHttpHandler(RequestContext requestcontext); MvcRouteHandler kalder den konkrete action i den givne controller public class MvcRouteHandler : IRouteHandler... Routing systemet er fleksibelt og kan benyttes i non-mvc scenarier Implementer blot egen RouteHandler februar 2008 ASP.NET MVC Framework 29

URL routing mange parametre Eksempel på brug af adskillige parametre public new Route Url = "Registrations/Employee/[initials]/[year]/[month]/[day]", Defaults = new controller = "Registrations", action = "Employee", year = (int?)null, month = (int?)null, day = (int?)null, RouteHandler = typeof(mvcroutehandler) ); Giver mulighed for at følgende URLer routes /Registrations/Employee/cja - alle registreringer på cja /Registrations/Employee/cja/2008 - alle reg. på cja i 2008 /Registrations/Employee/cja/2007/12 - alle reg. på cja i december 2007 /Registrations/Employee/cja/2008/02/20 - alle reg. på cja i dag til følgende action [ControllerAction] public void Employee(string initials, int? year, int? month, int? day)... februar 2008 ASP.NET MVC Framework 30

Url routing validering af parametre De enkelte tokens (parametre) i Url en kan også valideres new Route Url = "Registrations/Employee/[initials]/[year]/[month]/[day]", Defaults = new controller = "Registrations", action = "Employee", year = (int?)null, month = (int?)null, day = (int?)null, Validation = new initials = @"\pl 3,4" RouteHandler = typeof(mvcroutehandler) ); Dette resulterer i at initials skal være 3-4 bogstaver (letters) for, at denne Route kan benyttes februar 2008 ASP.NET MVC Framework 31

Url routing udgående url er For at routing reglerne kan være fuldstændigt afkoblede, er det også nødvendigt at kunne oprette links ud fra de samme regler Benyt HtmlHelper instansen til links Html.ActionLink Html.ActionLink("linktekst", new controller = "Home", action = "Default" ); Benyt Controller.RedirectToAction til at redirigere til en anden side RedirectToAction udløser en Response.Redirect RedirectToAction( new controller="home" action="default" ); februar 2008 ASP.NET MVC Framework 32

Tredje MVC demo fra controller til view Views må kun bero på de data Controller leverer ViewData overføres fra Controller til View [ControllerAction] public void Employees()... RenderView("Default", employees); Default.aspx (View) url RegistrationController (Controller) view data Employee.aspx (View) Details.aspx (View) Model februar 2008 ASP.NET MVC Framework 33

Overførsel af ViewData til viewet Siden med timerregistreringer for ansat skal udvides til også at vise stamoplysninger om ansat februar 2008 ASP.NET MVC Framework 34

Typesvag overførsel af ViewData I controlleren kan ViewData tilføjes typesvagt [ControllerAction] public void Employee(string initials, int? year, int? month, int? day) // Her hentes data fra modellen ViewData["Employee"] = employee; ViewData["Registrations"] = registrations; RenderView("Employee"); til følgende view public partial class Employee : ViewPage @ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"...... Navn: = ((Employee)ViewData["Employee"]).Firstname... foreach (Model1.WorkRegistration wr in ((WorkRegistrationList)ViewData["Registrations"]))... februar 2008 ASP.NET MVC Framework 35

Typestærk overførsel af ViewData (1) Ved hjælp af et specifikt ViewData-objekt public class EmployeeViewData public Model.Employee Employee get; set; public Model.WorkRegistrationList RegList get; set; kan ViewData tilføjes typestærkt i controlleren [ControllerAction] public void Employee(string initials, int? year, int? month, int? day) // Her hentes data fra modellen RenderView("Employee", new Views.Registrations.EmployeeViewData Employee = employee, RegList = registrations ); februar 2008 ASP.NET MVC Framework 36

Typestærk overførsel af ViewData (2) og ved at tilføje ViewData-klassen som typeparameter på viewet public partial class Employee : ViewPage<EmployeeViewData> er der typestærk adgang til ViewData: @ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"...... Navn: = ViewData.Employee.Firstname... <ul> foreach (Model1.WorkRegistration wr in ViewData.RegList) <li> = wr.date.toshortdatestring() : = wr.title - = ConvertToReadableTime(wr.TimespanInMinutes) - = Html.ActionLink("Se detaljer", new Action="Details", Id=wr.WorkRegistrationId ) </li> </ul>... februar 2008 ASP.NET MVC Framework 37

Brug af ViewUserControl (1) UserControls kan benyttes til at minimere dubleret kode, når dele af layout/funktionalitet går igen fra side til side (det er der jo ikke noget nyt i) ViewUserControl indsættes på et view nøjagtigt som UserControls indsættes i web forms @ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"... @ Register src="employeedetailscontrol.ascx" tagname="employeedetailscontrol" tagprefix="uc1"... <uc1:employeedetailscontrol ID="EmployeeDetailsControl1" ViewDataKey="Employee" runat="server" />... ViewData kan være identisk med sidens eller være en udsnit af de oprindelige ViewData Hvis ViewDataKey property er sat Anbefaling: Gør ViewUserControl typestærk og benyt ViewDataKey februar 2008 ASP.NET MVC Framework 38

Brug af ViewUserControl (2) Gør ViewData på ViewUserControl typestærk public partial class EmployeeDetailsControl : ViewUserControl<Employee> således at der er typestærk tilgang til data: @ Control Language="C#" CodeBehind="EmployeeDetailsControl.ascx.cs"... Navn: = ViewData.Firstname = ViewData.Lastname... På viewet sikres, at Employee sendes til ViewUserControl ved at sætte ViewDataKey... <uc1:employeedetailscontrol ID="EmployeeDetailsControl1" ViewDataKey="TheEmployee" runat="server" />... "TheEmployee" skal være en property på viewets ViewData af typen Employee februar 2008 ASP.NET MVC Framework 39

Fjerde MVC demo forms og post data Opret ny timeregistrering Redigering af eksisterende timeregistreringer februar 2008 ASP.NET MVC Framework 40

Forms og post data - eksekveringsfølge En action skaber data - en anden opdaterer data Registrations/DetailEdit RegistrationController Action = DetailsEdit view data DetailsEdit.aspx (View) Model Objekt(er) hentes fra modellen Postback RegistrationController Action = UpdateDetails Objekt(er) der er redigeret hentes fra modellen igen, opdateres herefter ud fra postback data og gemmes igen Model Fortsæt til ny side februar 2008 ASP.NET MVC Framework 41

Redigering af eksisterende objekt (1) Først oprettes links til opret og rediger controllere: @ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"...... = Html.ActionLink("Opret ny", new Action="DetailsEdit" )... foreach (Model1.WorkRegistration wr in ViewState.RegList)... = Html.ActionLink("Rediger", new Action="DetailsEdit", Id=wr.WorkRegistrationId )... DetailsEdit action [ControllerAction] public void DetailsEdit(System.Guid id) WorkRegistration wr = // Hentes fra modellen RenderView("DetailsEdit", wr); februar 2008 ASP.NET MVC Framework 42

Redigering af eksisterende objekt (2) DetailsEdit oprettes med typestærk ViewData public partial class DetailsEdit : ViewPage<WorkRegistration> DetailsEdit aspx @ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"...... form action med URL, der <h2>rediger timeregistrering</h2> peger på UpdateDetails action <form action="/registrations/updatedetails/ " method="post"> = ViewData.WorkRegistrationId Dato: = Html.TextBox("Date", ViewData.Date.ToShortDateString()) <br /> Beskrivelse: = Html.TextBox("Title", ViewData.Title) <br /> <input type="submit" value="gem ændringer" /> </form>... Id en på textboxen skal være have samme navn som propertyen, der redigeres februar 2008 ASP.NET MVC Framework 43

Redigering af eksisterende objekt (3)... Html uden ViewState og lange id er <h2>rediger timeregistrering</h2> <form action="/registrations/updatedetails/cb09290e-12f3-4b33-99d3- c98d94c7a49f" method="post"> Dato: <input id="date" name="date" size="20" value="19-02-2008"><br /> Beskrivelse:<input id="title" name="title" size="20" value="test af MVC framework"><br /> <input type="submit" value="gem ændringer" /> </form>... februar 2008 ASP.NET MVC Framework 44

Redigering af eksisterende objekt (4) Update action Form og get-parametre mappes automatisk til input parametre på action [ControllerAction] public void UpdateDetails(System.Guid id, System.DateTime date, int timespaninminutes, string title, string description) WorkRegistration wr; wr = // Hent eksisterende objekt fra modellen wr.date = date.date; wr.timespaninminutes = timespaninminutes; wr.title = title; wr.description = description; // Gem objektet i modellen RedirectToAction("Employees"); februar 2008 ASP.NET MVC Framework 45

Populering af dropdowns (1) Vi mangler at håndtere lister så der oprettes en dedikeret ViewData klasse public class WorkRegistrationEditViewData public WorkRegistration Wr get; set; public EmployeeList Employees get; set; public ProjectList Projects get; set; og i controller action en DetailsEdit tilføjes lister [ControllerAction] public void DetailsEdit (System.Guid id) WorkRegistrationEditViewData wredit = new WorkRegistrationEditViewData(); wredit.wr = // Hent WorkRegistration objekt fra modellen wredit.employees = // Hent alle Employees wredit.projects = // Hent alle Projects RenderView("DetailsEdit", wredit); februar 2008 ASP.NET MVC Framework 46

Populering af dropdowns (2) Brug af HtmlHelper-metoden Select... <form action="/registrations/updatedetails/ =ViewData.Wr.WorkRegistrationId. ToString() " method="post">... Dato: = Html.TextBox("Date", ViewData.Wr.Date.ToShortDateString()) <br /> Medarbejder: = Html.Select("EmployeeId", ViewData.Employees, (object)viewdata.wr.employee.employeeid.tostring())) <br />... <input type="submit" value="gem ændringer" /> </form>... I den anvendte overload tager Html.Select imod Id Listen, der skal displayes Det valgte elements key februar 2008 ASP.NET MVC Framework 47

Tilføj opret funktionalitet (1) Controller action en DetailsEdit tilrettes, så input parameteren id bliver nullable [ControllerAction] public void DetailsEdit (System.Guid? id) WorkRegistrationEditViewData wredit = new WorkRegistrationEditViewData(); if (id.hasvalue) wredit.wr = // Hent WorkRegistration objekt fra modellen wredit.employees = // Hent alle Employees wredit.projects = // Hent alle Projects RenderView("DetailsEdit", wredit); Wr-property på ViewData sættes til null, hvis det drejer sig om oprettelse af ny WorkRegistration februar 2008 ASP.NET MVC Framework 48

Tilføj opret funktionalitet (2) For at lette koden i viewets ascx-template oprettes en IsNew property i code behind public partial class DetailsEdit : ViewPage<WorkRegistrationEditViewData> protected bool IsNew; public void Page_Load() IsNew = (ViewData.Wr == null); Udsnit af viewets ascx-template Der sættes tomme strenge ind i input, hvis det er opret: if (IsNew) <h2>opret ny timeregistrering</h2> else <h2>rediger timeregistrering</h2> <form action="/registrations/updatedetails/ = (IsNew)? "" : ViewData.Wr.WorkRegistrationId.ToString() " method="post"> Dato: = Html.TextBox("Date", (IsNew)? "" : ViewData.Wr.Date.ToShortDateString()) <br />... februar 2008 ASP.NET MVC Framework 49

Tilføj opret funktionalitet (3) Update action tilrettes, så den kan håndtere opret [ControllerAction] public void UpdateDetails(System.Guid? id, System.DateTime date, int timespaninminutes, string title, string description) WorkRegistration wr; if (id.hasvalue) wr = // Hent eksisterende objekt fra modellen else wr = new Model1.WorkRegistration(); wr.workregistrationid = System.Guid.NewGuid(); wr.date = date.date; wr.timespaninminutes = timespaninminutes; wr.employee = // Hent employee fra modellen ud fra id wr.project = // Hent project fra modellen ud fra id wr.title = title; wr.description = description; // Gem objekt i modellen RedirectToAction("Employees"); februar 2008 ASP.NET MVC Framework 50

Simplificer update action anvend UpdateFrom(Request.Form) Mapper form-parametre direkte ind på model objekt [ControllerAction] public void UpdateDetails(System.Guid? id) WorkRegistration wr; if (id.hasvalue) wr = // hent eksisterende objekt fra model else wr = new Model1.WorkRegistration(); wr.workregistrationid = System.Guid.NewGuid(); wr.updatefrom(request.form); // Hack - det ser ikke ud til at referencer håndteres af UpdateFrom // det må være en fejl i den nuværende version wr.employee = // Hent employee ud fra key fra // new System.Guid(Request.Form["employeeId"])); wr.project = // Hent på tilsvarende vis project // Gem objekt i modellen og foretag en redirect... februar 2008 ASP.NET MVC Framework 51

ASP.NET MVC Framework MVC Framework er et alternativ til web forms Ikke en afløser! MVC har klare styrker så længe, det drejer sig om visning af data JavaScript, CSS m.v. bliver lettere tilgængelig, når sideopbygning er simplere (simplere ID er m.v.) Den klare opdeling mellem forretningslogik og UI-del Web forms har klart fordele (endnu i hvert tilfælde) når det kommer til redigering og kompleks brugerinteraktion februar 2008 ASP.NET MVC Framework 52

Spørgsmål www.captator.dk nyheder, artikler, information,... februar 2008 ASP.NET MVC Framework 53