UTBILDNING FÖR SIBA I WEB FOUNDATION
Erik Brandin, 16 februari 2010
FÖRVÄNTNINGAR
 Vilka förväntningar har ni på dagen?
SYFTE MED DAGEN
 En första inblick i Web Foundation
 Förstå vad Web Foundation är
 Veta hur Web Foundation kan anpassas
 Övningar
AGENDA
Demo av Web Foundation – (15min)
Presentation av MVC – (60min)
Demo av eNOVA CMS (och tillägg gjorda i Web Foundation) (15min)
Lab #1 - Anpassning av vy (30 min)
Koppling mellan sidtyper – controller/action och vyer i CMS/WF
(15min)
 Lab #2 – Skapa ny vy (60 min)
 Arkitektur Web Foundation (60 min)
 Lab #3 – Utökning av befintlig funktion i Web foundation (60min)





– Utökning av vydata (modellen)
– Ny interaktionslogik
– Ny affärslogik
 Wrap up (15 min)
DEMO
 Demo av Web Foundation
PRESENTATION AV ASP.NET MVC
 Kommande timmen kommer vi att stifta bekantskap med Microsoft
MVC
 Förståelse för ASP.NET MVC krävs för att få ut maximalt av Web
Foundation
 Web Foundation inför en hel del förändringar i standardbeteendet i
ASP.NET MVC
MVC I ÖVERSIKT
VAD ÄR MVC
 MVC är ett arkitekturellt designmönster
 Beskrevs första gången 1979
 Finns i många implementationer
– Ruby on Rails, Spring och Struts, Monorail med flera
– http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
 Microsoft ASP.NET MVC är en av dessa implementationer
– Första releasen 2009!
 Microsoft MVC är ett lager ovanpå ASP.NET
– ASP.NET kan användas i en MVC applikation
MVC I ÖVERSIKT
GRUNDPELARE I MVC
 Controller
– Hanterar kommunikationen med användaren
 Model
– Innehåller all data som behövs för att visa sidan
 View
– Användargränssnitt
MVC I ÖVERSIKT
VARFÖR BEHÖVS MVC
 Separerar logik från design
 Testbart
 ASP.NET MVC är utbyggbart och utbytbart
 Enkelt att påföra ny design
– ”Saknar” ASP.NETs beroende mellan HTML och affärslogik
ASP.NET MVC
 Nu går vi in på detaljer i Microsoft ASP.NET MVC
ROUTE TABELL
VILKEN KOD KÖRS DÅ WEBBLÄSAREN BEGÄR EN SIDA?
 Det finns en default route i MVC
– {controller}/{action}/{id}
 Exempel ”http://www.ajprodukter.se/Product/Show/Screwdriver
 Metoden som kommer att anropas är:
ProductController.Show(string id)
 Vyn som visas:
/Views/Product/Show.aspx
 I eNOVA CMS är detta inte hela sanningen…
CONTROLLERS OCH ACTIONS
ANSVARSOMRÅDE FÖR CONTROLLERS OCH ACTIONS
 Controllers är den del av MVC som ansvarar för att…
– …ta emot request från klienten (webbläsaren)
– …validerar requestet
– …hämtar data och ser till att vidarebefordra till rätt vy
 Controller ärver från basklassen System.Web.Mvc.Controller
– Har ett namn som slutar på Controller
 Actions är de metoder på controllern som kan ta emot ett anrop från
klienten
 Action-metoden är alla publika metoder i en controller som returnerar
ett ActionResult
 Återigen är detta inte hela sanningen i eNOVA CMS…
KODEXEMPEL
ENKEL CONTROLLER ACTION FRÅN SECTIONCONTROLLER
 Följande kod svarar på anrop till /Section/List/xxx
MODEL
MODEL ÄR DATA SOM SKICKAS FRÅN CONTROLLERN
 Data som skickas från controllern kan vara en databärande klass
– Detta ger typade dataobjekt i vyerna vilket ger intellisense-stöd i VS
– Enklare för vy-utvecklare
– Skapat många databärande klasser med repetitiv kod
 Men även Microsoft MVC har en generisk ViewData
– I praktiken en dictionary med otypad data (string-object)
– Enkel att skapa ny data
– Försvårar för vyutvecklare då man inte får hjälp av Visual Studio
 Typad och otypad data kan blandas
 Vi har valt att så långt som möjligt endast använda typade
modellobjekt
VIEW
VYNS ANSVAR I MVC ÄR ENDAST PRESENTATION
 Vyn bär ansvaret att skapa användargränssnittet
 Vyer är MVC en klass som ärver från System.Web.Mvc.ViewPage
 Controllern skicka all data som krävs för presentationen till vyn
 Kodblock läggs in i vyn med <% [Code]; %>
– Ser vid första anblick ut som klassisk ASP
– <%= Uttryck %> är kortform för <% Response.Write(Uttryck); %>
– Notera användningen av semikolon
 Kod i vyn ska vara enkel presentationslogik
– Ingen affärslogik bör ligga i vyn
– Javascript är (ibland) presentationslogik och kan bli komplex
 Ingen begränsning på html som kan genereras
TYPAD VS OTYPAD VY
EN TYPAD VY HAR EN SÄRKILT UTPEKAD MODELLKLASS
 En typad vy ärver från System.Web.Mvc.ViewPage<T>
– T är en generisk klass som är åtkomlig från vyn genom propertyn Model
 En otypad vy ärver från System.Web.Mvc.ViewPage
– Propertyn ViewData är en dictionary som otypad data
– ViewData finns även för typade vyer
EXEMPEL PÅ EN ENKEL VY I ENOVA CMS
PARTIELLA VYER
LIKA MED USER CONTROL
 Partiella vyer (ascx)
– Motsvarar user controls i ASP.NET
– Kan vara starkt typade precis som vyer
 En partiell renderas oftast från en ”vanlig vy”
– Då den anropas från en annan vy skickas ofta en delmängd av modellobjektet
med, exempelvis en produkt i en produktlista
 Kan även ”anropas” från en controller
– Görs oftast vid AJAX-anrop där resulterande html är en delmängd av
presentationen
MASTERPAGE
MASTERPAGE, VYER OCH PARTIELLA VYER
 Masterpage stödjs av ASP.NET MVC
 Samma modellobjekt som skickas till vyn skickas till
master page
– Alla våra ViewData implementerar interfacet IMasterPageViewData
– IMasterPageViewData innehåller data för meny, breadcrumb, varukorg etc.
B2B FOUNDATION
VAD ÄR B2B FOUNDATION
 Hittills har vi visat hur ASP.NET MVC fungerar
 Vi har gjort anpassningar av detta i MVC
B2B FOUNDATION
VAD ÄR B2B FOUNDATION
 B2B Foundation baseras på ASP.NET MVC
 Innehåller basfunktionalitet som de flesta B2B
applikationer behöver
 Är komponentiserat och utbytbart i de flesta avseenden
delar
– Controller, vydata, affärslogik (service-lager)
– Dependency Injection via AutoFac-ramverket
 Viss javascript funktionalitet med jQuery
ANPASSNINGAR AV ASP.NET MVC
ENOVA CMS OCH B2B FOUNDATION HAR GJORT VISSA INGREPP I MVC

Controller kan bytas ut dynamiskt
–
–

Att byta ut en controller sker i kod eller konfiguration och sker normalt endast vid installation
Denna anpassning sker i B2B Foundation
Affärslogik kan kundanpassas
–
Utöka eller byta ut basfunktionalitet

Vydata (=Model) kan kundanpassas

Controller/Action/Vyer väljs i backoffice
–
–
–
–

Controller/Action väljs under ”Händelse”
Vyer väljs under ”Vy”
Varje CMS-sida eller produktsida kan konfigureras till att använda någon av de vyer projektet
har implementerat
Denna anpassning sker i Enova CMS
Routes byggs upp per sida för bättre sökmotoroptimering
HTML HELPERS
HTML HELPERS GENERERAR HTML-KOD
 Html-helpers är hjälpfunktioner som genererar html-kod
– Bör endast användas för att generera enkla html taggar
– Innehåller endast för presentationslogik
 En mängd html helpers finns inbyggt
–
–
–
–
–
–
Html.BeginForm
Html.Image
Html.Input
Html.Hidden
Html.ListBox
Html.ActionLink
 Kan skapa egna html helpers efter behov, exempelvis
– Html.SystemText
– Html.BuildUrl (i praktiken samma som Html.ActionLink men där data för att generera
länken hämtas från eNOVA)
– Html.ProductImage
HTML HELPERS
HTML HELPERS ANVÄNDS FÖR ATT ANROPA PARTIELLA VYER
 Html.RenderPartial
– Används för att bryta ut repetitiv html-kod
– Anropar en partiell vy
 Html.RenderAction
– Anropar en specifik action på en controller och infogar resultatet i html
dokumentet
– Smidigt sätt att skapa nytt innehåll direkt i vyn
– Egentligen inte MVC, utan MVP
– Något sämre prestanda än RenderPartial eftersom en controller factory måste
anropas
DEMO
Demo av eNOVA CMS
LAB #1
 Anpassning av en befintlig vy
KOPPLING MELLAN SIDTYP, ACTION OCH VY
SIDTYP
 En sidtyp i eNOVA CMS är en klass som ärver EnovaCmsPage
 Denna ska inte ha några språkberoende attribute
– Språkberoende ligger på sajt-nivå istället
 Inbyggd versionshantering i revisionsdatabasen
 I övrigt precis som vilken eNOVA-klass som helst
SYNKRONISERING AV HÄNDELSER OCH VYER
 Vilka valbara händelser och vyer anges i webbkoden
 Men valen dyker upp i backoffice
 Ingen webbkod ligger i core-filerna (med eNOVA-klasser)
 Händelser och vyer synkroniseras över från web applikationen till
backoffice vid uppstart
KOPPLING MELLAN SIDTYP, ACTION OCH VY
CMS VIEW DATA TYPE
 eNOVA-klasser exponeras inte direkt i vyn
– Vi behöver en vydataklass för detta (=modell)
 En arvsstruktur i eNOVA-klasser bör (=skall) matchas av samma
arvsstruktur i vydatatyp
 Det är en 1-1 koppling mellan sidtyp och vydatatyp
 Vydataklassen är en databärande klass som markeras med
attributete CmsPageTypeDefinitionAttribute
HUR ANGER MAN EN VALBAR HÄNDELSE (ACTION)
 Vydatatypen används för att ange vilken controller/action och vy
som kan väljas i backoffice
 En vydatatyp bör ha actions i endast en controller
 En valbar action markeras med två attribut:
– ActionDefinitionAttribute för att ge ett friendly name (en per språk)
– ViewDataDefinitionAttribute för koppling till sidtypen
HUR MAN ANGER EN VALBAR VY
 En sidtyp kan ha valfritt antal vyer
– Valet av vy är frikopplat från val av action…
– …men mappen för vyn tas från controllern
 En valbar vy markeras med attributen:
– ViewDefinitionAttribute för friendly name
– AssociatedToCmsViewDataAttribute för koppling till sidtypen
 En code behind krävs för synkronisering av vyn.
 Exempel på code behind:
OT: VYERNA TYPAS INTE PÅ CMS VYDATA
 Vyerna i Web Foundation är typade
 Dock är de inte typade på cms-vydatatypen
 Händelsen bestämmer vilken vydatatyp som skickas till vyn
 Alla vydatatyper i Web Foundation implementerar
IMasterPageViewData
 IMasterPageViewData har en property CmsData och det är denna
som innehåller data från CMS-sidan
 Mer om detta senare.
LAB #2
 Skapa en ny vy i Sandbox-projektet
 Starta web applikationen för att synkronisera över vyn till backoffice
 Lägg in vyn på en befintlig sida
 Anpassa vyn
ARKITEKTUR I WEB FOUNDATION




Ta utgångspunkt i lagerskissen.
Beskriv de olika lagren och dess ansvarsområden
Beskriv autofac
Gå tillbaka och ge exempel på hur vart och ett av lagren kan
anpassas. Visa med kodexempel
–
–
–
–
–
–
–
–
controller via named service
Factory som container scoped
ViewData som factory scoped
ViewData som expression
Service som container scoped
Beroenden till service och factory i konstruktor
Beroenden till ViewData i IContainerProvider
Ge exempel på utökad funktion – StaticLeftMenuMasterPageViewDataFactory.
 Skillnaden mellan CMS-vydata och WebFoundation vydata
 Beräknad till 1h
LAB #3
 Utöka funktionaliteten i sidan ”Kontakta oss”.



Cms sidtyp: Wipcore.Webfoundation.Core.ContactUsPage
Cms vydataklass:
Wipcore.WebFoundation.Viewdata.CmsContactUsViewData
WF vydataklass: