45
1 Copenhagen Software 24-03-2010 Microsoft ASP.NET MVC 1+2 Stig Irming-Pedersen

Mvc 1+2 Tech Talk 201003

Embed Size (px)

DESCRIPTION

An introduction to the ASP.NET MVC framework by SaaS consultants Copenhagen Software. In Danish.

Citation preview

Page 1: Mvc 1+2 Tech Talk 201003

1 Copenhagen Software24-03-2010

Microsoft ASP.NETMVC 1+2

Stig Irming-Pedersen

Page 2: Mvc 1+2 Tech Talk 201003

2 Copenhagen Software24-03-2010

Software as a Service konsulenter

Copenhagen Software

Software-udvikling

Forretnings-udvikling

Cloud ComputingSoftware as a Service (SaaS)

Page 3: Mvc 1+2 Tech Talk 201003

3 Copenhagen Software24-03-2010

Erfaringer med MVC

Copenhagen Software

• Har benyttet ASP.NET MVC siden Q1 2008

• Har leveret løsninger på ASP.NET MVC lige siden

Klimakonsortiets EnergyMapwww.energymap.dk

Health Group A/S‟ sundhedsportalerwww.wemove.dk

Page 4: Mvc 1+2 Tech Talk 201003

4 Copenhagen Software24-03-2010

Hvad kommer der til at ske?

ASP.NET MVC

1. Introduktion af ASP.NET MVC

2. Grundlæggende funktionalitet

3. Nyt i ASP.NET MVC 2.0

4. Avanceret funktionalitet

5. Deployment

Page 5: Mvc 1+2 Tech Talk 201003

5 Copenhagen Software24-03-2010

Hvad er ASP.NET MVC?

Introduktion af ASP.NET MVC

Gratis supplement til Microsofts eksisterende ASP.NET

Alternativ til WebForms

Understøttet i .NET Framework 3.5 SP1 (og i .NET 4)

Integreret i Visual Studio 2008 SP1 (og i VS 2010)

Version 1.0 er frigivet 18. marts 2009 under Ms-PL

Version 2.0 er frigivet 12. marts 2010 under Ms-PL

Page 6: Mvc 1+2 Tech Talk 201003

6 Copenhagen Software24-03-2010

ASP.NET

Hvad er ASP.NET MVC?

Kontrolbibliotek

Caching

Databaseadgang

AJAX

Sessionshåndtering

Rettighedsstyring

HTML

Sikkerhed

HTTP abstraktion

URL håndtering

Kontrolarkitektur

Konfiguration

ASP.NET• Solidt• Skalerbart• Omfattende

ASP.NET MVC

Page 7: Mvc 1+2 Tech Talk 201003

7 Copenhagen Software24-03-2010

Hvorfor ASP.NET MVC?

Introduktion af ASP.NET MVC

Model-view-controller

Kontrol med URL‟er (SEO)

Kontrol over HTML

Konventionsbaseret

Aspect-oriented programming

Unit Testing

Frihed

◦ Udvidbart

◦ View engine

◦ Test framework

◦ og meget mere...

Page 8: Mvc 1+2 Tech Talk 201003

8 Copenhagen Software24-03-2010

Model-view-controller

Applikation

Model

Controller

View

View: Markup som fortolkes og vises af klienten

Model: Objekter som repræsenterer de data applikationen arbejder med.

Controller: Håndterer input fra view og interagerer med modellen.

Introduktion af ASP.NET MVC

Page 9: Mvc 1+2 Tech Talk 201003

9 Copenhagen Software24-03-2010

Udvikling af CRUD applikation

Grundlæggende funktionalitet

1. Konventioner

2. Controllers og actions

3. Views

4. Navigering

5. Data input

6. Model binding

7. Unit testing

8. Validering

9. ASP.NET MVC pipeline

Page 10: Mvc 1+2 Tech Talk 201003

10 Copenhagen Software24-03-2010

Controllers og actions

Konventioner

www.domæne.dk/Product/Edit/123

public class ProductController : Controller

{

public ViewResult Edit(int id)

{

//Do something clever

}

}

~/view/Product/Edit.aspx

Page 11: Mvc 1+2 Tech Talk 201003

11 Copenhagen Software24-03-2010

Filer og typer

Views

Views er klassiske .aspx-filer uden code-behind

De renderes med WebForms view enginen

Views nedarver fra System.Web.Mvc.ViewPage

ViewPage kan være parameteriseret i Model typen:◦ ViewPage<TModel>

Et view indholder følgende essentielle properties:◦ Model: det faktiske model objekt medsendt fra action‟en

◦ ViewData: anden data sendt med til view‟et

◦ ViewContext: information om konteksten

◦ TempData: data fra sidste round-trip

Page 12: Mvc 1+2 Tech Talk 201003

12 Copenhagen Software24-03-2010

HTML Helpers

Views

HTML Helpers er metoder til generering af HTML

Extension methods knyttet til System.Web.Mvc.HtmlHelper

Tilgås via Html-property‟en på ViewPage

Erklæret i bl.a. System.Web.Mvc.Html.InputExtensions

Type-stærke hjælpemetoder er tilføjet i MVC 2.0

public static MvcHtmlString TextBox(this HtmlHelper htmlHelper,

string name,

object value);

public static MvcHtmlString TextBoxFor<TModel, TProperty>(

this HtmlHelper<TModel> htmlHelper,

Expression<Func<TModel, TProperty>> expression);

<%= Html.TextBox("Title", Model.Title) %><%= Html.TextBoxFor(model => model.Title) %>

Page 13: Mvc 1+2 Tech Talk 201003

13 Copenhagen Software24-03-2010

MVC Pipeline

Opsummering

URL

•URL‟er afbildes til actions i controllers

•Afbildning konfigureres, så URL‟er og filstruktur er uafhængige

Action

•En action er en public metode på en Controller

•En action tager imod input, udfører forretningslogik og vælger et view

View

•WebForms bruges som view engine (.aspx)

•View‟et renderer HTML til klienten

Page 14: Mvc 1+2 Tech Talk 201003

14 Copenhagen Software24-03-2010

Routing og links

Navigering

URL‟er og controller actions bindes sammen via routes

En route tabel dannes når applikationen startes

En route består af ◦ URL-skabelon

◦ Angivelse af controller og action

◦ Eventuelt constraints på URL (regulære udtryk)

URLpublic ActionResult SomeAction()

{

//Do something clever

}

Url.Action(”Action", ”Controller")URL

Html.ActionLink(“Link text",

“Action",

“Controller")

<a href=”...”>Link text

</a>

Page 15: Mvc 1+2 Tech Talk 201003

15 Copenhagen Software24-03-2010

GET / POST/ Redirect / GET

Data input

At indsamle input fra brugeren gøres i flere trin:

PO

ST C

reate

(...

data

...)

Redirect

til D

eta

ils(i

d)

GET D

eta

ils(i

d)

Retu

rner

HTM

L for

Deta

ils(i

d)

GET C

reate

()

Retu

rner

<fo

rm>

Page 16: Mvc 1+2 Tech Talk 201003

16 Copenhagen Software24-03-2010

GET / POST

Data input

Hvis data ikke accepteres af serveren, ser det lidt anderledes ud:

GET C

reate

()

PO

ST C

reate

(...

data

...)

Retu

rner

præ

-udfy

ldt

<fo

rm>

Retu

rner

<fo

rm>

Page 17: Mvc 1+2 Tech Talk 201003

17 Copenhagen Software24-03-2010

Fra data input til model

Model binding

Model binding konverterer request data til Model objekter

Request data leveres gennem ValueProvider i nævnte rækkefølge:◦ Form data fra POST

◦ URL routing parametre

◦ Query string parametre

<label for="Title">Title:</label>

<%= Html.TextBox("Title", Model.Title)%>

public ActionResult Create(string Title)

{

//Validate and create

}

public ActionResult Create(Note note)

{

//Validate and create

}

eller

Page 18: Mvc 1+2 Tech Talk 201003

18 Copenhagen Software24-03-2010

Model binding

Input fra brugeren

Navnekonvention for at hente data i ValueProvider:◦ nameOfActionParameter.NameOfModelProperty.NameOfModelSubProperty

◦ collectionParameter[n].NameOfModelProperty

Model egenskaber kan kontrolleres med BindAttribute:◦ Prefix (nameOfActionParameter)

◦ Include (NameOfModelProperty)

◦ Exclude (NameOfModelProperty)

Model binding kan kontrolleres yderligere ved direkte kald:◦ UpdateModel(model, prefix, inclProperties, exclProperties, valueProvider)

◦ TryUpdateModel(model, prefix, inclProperties, exclProperties, valueProvider)

Model binding kan udskiftes ved implementation af IModelBinder:◦ ModelBinders.Binders.DefaultBinder = new MyModelBinder();

◦ ModelBinders.Binders.Add(typeof(MyModel), new MyModelBinder());

Page 19: Mvc 1+2 Tech Talk 201003

19 Copenhagen Software24-03-2010

Test af controller actions

Unit testing

Adskillelse af markup og logik gør det muligt at teste logikken isoleret

Actions er ikke afhængige af statiske klasser (i modsætning til ASP.NET Classic)

Model binding gør, at action metoder nemt kan fodres med testdata

Vi kan teste indholdet i et ActionResult uden at skulle behandle HTML

///Arrange

var note = new Note(...);

var controller = new NoteController();

///Act

var result = controller.Edit(note) as ViewResult;

///Assert

Assert.AreEqual<string>("Edit", result.ViewName);

Page 20: Mvc 1+2 Tech Talk 201003

20 Copenhagen Software24-03-2010

Server side validering

Validering

I ASP.NET Classic er validering blandet sammen med markup:

I ASP.NET MVC foretages validering i controlleren (eller endnu bedre, i modellen!) og fejl registreres i Controller.ModelState:

<asp:RegularExpressionValidator

ID="REV“ ControlToValidate="SomeControl"

ErrorMessage="Error!” ValidationExpression="\d{10}"

runat="server" />

private void ValidateNote(Note note) {

if (String.IsNullOrEmpty(note.Title)){

ModelState.AddModelError("Title", "Title required");

}

}

<%= Html.ValidationMessage("Title", "*")%>

<%= Html.ValidationSummary("Please correct the errors and try again.") %>

Page 21: Mvc 1+2 Tech Talk 201003

21 Copenhagen Software24-03-2010

Server side validering

Input fra brugeren

Validering er væsentligt forbedret i MVC 2.0

Support af System.ComponentModel.DataAnnotations(ASP.NET Dynamic Data, Silverlight and Silverlight RIA):◦ RequiredAttribute

◦ StringLengthAttribute

◦ RangeAttribute

◦ RegularExpression

◦ DataType

◦ ….

Validering kan udskiftes ved implementation af:◦ ModelValidatorProvider / AssociatedModelValidatorProvider

◦ ModelValidator

◦ ModelValidationResult

◦ ModelClientValidationRule

Page 22: Mvc 1+2 Tech Talk 201003

22 Copenhagen Software24-03-2010

Behandling af request

MVC Pipeline

Vi har nu en CRUD applikation

Behandling af indkommende requests ser således ud

Routing vælger controller og action

Model binding

Model validering

Action eksekveres

ActionResult eksekveres

(view renderes)

Page 23: Mvc 1+2 Tech Talk 201003

23 Copenhagen Software24-03-2010

Ny funktionalitet

Nyt i ASP.NET MVC 2.0

1. Client side validering

2. Child actions

3. Templated helpers

4. Areas

5. Async controllers

6. HTTP verbs override

Page 24: Mvc 1+2 Tech Talk 201003

24 Copenhagen Software24-03-2010

JavaScript validering

Client side validering

MVC 1.0 krævede en del fodarbejde eller brug af f.eks. xVal

MVC 2.0 har indbygget support for DataAnnotations attributter

Der genereres JSON validerings metadata til brug i browseren

Følgende JavaScript valideringer supporteres:◦ Microsoft AJAX

◦ jQuery validation

Følgende indsættes i view (før Html.BeginForm):<% Html.EnableClientValidation(); %>

Page 25: Mvc 1+2 Tech Talk 201003

25 Copenhagen Software24-03-2010

Genbrug af markup

Child actions

I MVC 1.0 kan markup genbruges med Partielle Views◦ Nedarver fra ViewUserControls (.ascx)

◦ Svarer til UserControls i ASP.NET Classic

◦ En ViewUserControl har en Model property på samme måde en ViewPage

◦ En ViewUserControl har ingen forretningslogik

<% Html.RenderPartial(”EditForm", Model); %>

<%@ Control Language="C#“ Inherits="System.Web.Mvc.ViewUserControl<SpiffyNotes.Models.Note>" %>

<% using (Html.BeginForm()){%>

<label for="Title">Title:</label>

<%= Html.TextBox("Title", Model.Title)%>

<label for="Description">Description:</label>

<%= Html.TextArea("Description", Model.Description)%>

<input type="submit" value="Save" />

<% } %>

En ViewUserControl bruges med Html.RenderPartial():

Page 26: Mvc 1+2 Tech Talk 201003

26 Copenhagen Software24-03-2010

Genbrug af logik

Child actions

I MVC 2.0 er muligt at kalde action metoder fra views◦ Komplekse objekter kan gives som argumenter

Fra views kan action metoder kaldes med:◦ Html.RenderAction (skriver direkte til Response)

◦ Html.Action (returnerer streng)

Action metoder kan dekoreres med [ChildActionOnly] attribut:◦ Kan ikke kaldes som almindelige action

◦ Håndterer caching anderledes

Page 27: Mvc 1+2 Tech Talk 201003

27 Copenhagen Software24-03-2010

Auto scaffolding

Templated helpers

Bruges til automatisk visning eller editering af objekter

Svarer til funktionalitet i Dynamic Data

Helper metoder er erklæret iSystem.Web.Mvc.Html.DisplayExtensions og –EditorExtensions:◦ Html.Display(“Title”)

◦ Html.DisplayFor(model => model.Title)

◦ Html.DisplayForModel()

◦ Html.Editor(“Title”)

◦ Html.EditorFor(model => model.Title)

◦ Html.EditorForModel()

Page 28: Mvc 1+2 Tech Talk 201003

28 Copenhagen Software24-03-2010

Overriding templates

Templated helpers

Default templates kan overrides ved at nedarve fraViewUserControl

Pr. konvention kaldes egne templates “<type>.ascx” og anbringes i folderne „DisplayTemplates‟ og „EditorTemplates‟

Folderne bestemmer prioriteten af templates og kan anbringes:◦ I Shared-folderen under Views

◦ I view-folderen for en given controller

◦ Tilsvarende for areas

Meta data kan tilgås via ViewData.ModelMetadata property‟en

Meta data indeholder bl.a:◦ Model og ModelType

◦ ContainerType og PropertyName

◦ Properties med yderligere meta data

Page 29: Mvc 1+2 Tech Talk 201003

29 Copenhagen Software24-03-2010

Model meta data

Templated helpers

Meta data fås fra modellen via MetadataModelProvider

Den samme meta data anvendes ved Model binding

MVC 2.0 understøtter System.ComponentModel og System.ComponentModel.DataAnnotations

Følgende attributter kan anvendes:◦ [HiddenInput]

◦ [UIHint]

◦ [DataType]

◦ [ReadOnly]

◦ [DisplayFormat]

◦ [ScaffoldColumn]

◦ [DisplayName]

Page 30: Mvc 1+2 Tech Talk 201003

30 Copenhagen Software24-03-2010

Inddeling i områder

Areas

Giver mulighed for inddeling af et projekt i områder

Hvert area indeholder foldere til:◦ Models

◦ Controllers

◦ Views

Hvert area konfigureres via nedarvet AreaRegistration:◦ AreaName: property for områdets navn

◦ RegisterArea: metode til registrering af områdespecifikke routes

Alle areas registreres i Global.asax via hjælpemetode: ◦ AreaRegistration.RegisterAllAreas()

I MVC 2.0 er „area‟ et reserveret ord i routing konfigurationer

Page 31: Mvc 1+2 Tech Talk 201003

31 Copenhagen Software24-03-2010

Optimering af threads forbrug

Asynchronous controllers

Mulighed for optimering af brug af web server threads

Requests med længerevarende kald blokerer threads

Med asynkrone controllers er det muligt at frigive threads vedventen og efterfølgende få en ny thread fra poolen

Async controllers nedarver fra AsyncController frem for Controller

Asynkrone controllers er først nyttige ved flere requests end threads og afhænger af eksterne services

Page 32: Mvc 1+2 Tech Talk 201003

32 Copenhagen Software24-03-2010

Håndtering af HTTP verbs

HTTP verbs override

REST benytter HTTP verbs som GET, PUT, POST og DELETE

MVC 2.0 understøtter nye action method attributter:◦ HttpPostAttribute

◦ HttpPutAttribute

◦ HttpGetAttribute

◦ HttpDeleteAttribute

Browsere understøtter ikke alle verber

Html.HttpMethodOverride(HttpVerbs) renderer hidden input element, som håndteres af de nye attributter

Page 33: Mvc 1+2 Tech Talk 201003

33 Copenhagen Software24-03-2010

ASP.NET MVC 2.0

Andre nyheder

Model validering erstatter input validering (alle egenskabervalideres uafhængig af tilstedeværelse i form POST)

Binary data kan håndteres af Model binders

Ny DefaultValueAttribute til action parameters

Ny RequireHttpsAttribute action filter

Html.ValidationSummary kan vise fejlbeskeder for model fejl

JsonResult virker nu kun med HTTP POST requests

HTML helpers returner MvcHtmlString objekt

Page 34: Mvc 1+2 Tech Talk 201003

34 Copenhagen Software24-03-2010

Oversigt

Avanceret funktionalitet

1. AJAX

2. ActionResult

3. Filters

4. MVC Pipeline

5. Udvidbarhed

6. T4 templates

Page 35: Mvc 1+2 Tech Talk 201003

35 Copenhagen Software24-03-2010

Ajax Helpers

AJAX

Ajax Helpers betegner metoder til generering af AJAX kald

AJAX‟ificerede pendanter til HTML Helpers

Tilgås via Ajax-property‟en på ViewPage

Defineret i System.Web.Mvc.Ajax.AjaxExtensions

<div id="formElement" >

<% using (Ajax.BeginForm(

new AjaxOptions { UpdateTargetId = "formElement",

OnFailure = "handleError" }))

{%>

<!-- Some <form> -->

<%}%>

</div>

<script language="javascript" type="text/javascript“>

function handleError(ajaxContext) {

document.getElementById("formElement").innerHTML = ajaxContext.get_data();

}

</script>

Page 36: Mvc 1+2 Tech Talk 201003

36 Copenhagen Software24-03-2010

jQuery

AJAX

jQuery er et JavaScript-bibliotek, der gør programmering i JavaScript sjovt – eller i hvert fald mindre håbløst:

jQuery følger med Visual Studios MVC templates!

jQuery kan bruges i stedet for Ajax Helpers

Fordi ASP.NET MVC vil give dig fuld kontrol over din HTML, indeholder det ikke kontroller til kalendere, grids mv. I stedet benyttes typisk grids fra JavaScript frameworks:◦ jQuery (og jQuery UI)

◦ Ext JS

◦ Teleriks kontroller

◦ Din egen favorit

Page 37: Mvc 1+2 Tech Talk 201003

37 Copenhagen Software24-03-2010

ActionResult typer

ActionResult

En action skal returnere et ActionResult

ActionResult‟ets type afgør, hvad der returneres til brugeren

public abstract class ActionResult

{

public abstract void ExecuteResult(ControllerContext context);

}

ActionResult

ViewResultRenderer view

ContentResult

Renderer ren tekst

FileResult

Returnerer fil

HttpUnauthorized-Result

HTTP Status code 401

JSONResult

Objekt serialiseret som JSON

RedirectResult

Redirect til URL

Dit eget ActionResult

???

Page 38: Mvc 1+2 Tech Talk 201003

38 Copenhagen Software24-03-2010

Action Filters

Filters

Med filters kan man elegant klistre ekstra logik på sine actions

Implementeres som attributter, som forstås og evalueres af ASP.NET MVC frameworket

Perfekt til deklarativ håndtering af cross-cutting concerns◦ Authentication

◦ Logging

◦ Database connection management

◦ Fejlhåndtering

Der er fire typer filtre, som evalueres på forskellige tidspunkter:◦ IAuthorizationFilter

◦ IActionFilter

◦ IResultFilter

◦ IExceptionFilter

Filtre evalueres i speciel rækkefølge og exceptions “bobler” op gennem dem

Page 39: Mvc 1+2 Tech Talk 201003

39 Copenhagen Software24-03-2010

Action Filters

Filters

IActionFilter:Evalueres umiddelbart før og efter den tilhørende action metode køres

IResultFilter:Evalueres umiddelbart før og efter ActionResult‟et evalueres

public interface IActionFilter

{

void OnActionExecuted(ActionExecutedContext filterContext);

void OnActionExecuting(ActionExecutingContext filterContext);

}

public interface IResultFilter

{

void OnResultExecuted(ResultExecutedContext filterContext);

void OnResultExecuting(ResultExecutingContext filterContext);

}

Page 40: Mvc 1+2 Tech Talk 201003

40 Copenhagen Software24-03-2010

Udvidet pipeline

MVC Pipeline

Authorize filtre

Action filtreAction

eksekveresAction filtre

Result filtreActionResult eksekveres

Result filtre

URLRouting vælger action

Model binding

Model validering

View eksekveres( )

Page 41: Mvc 1+2 Tech Talk 201003

41 Copenhagen Software24-03-2010

Extension Points

Udvidbarhed

IRouteHandler: oversætter URL til IHttpHandler◦ ASP.NET MVC benytter en MvcRouteHandler. Med din egen IRouteHandler kan du helt forbigå ASP.NET

MVC.

IModelBinder: binder request data til model og validerer◦ Håndter binding anderledes (inject dependencies i model)

◦ Brug model meta data (indeholder valideringsinformation) anderledes

IControllerFactory: instantierer controllers◦ Dependency Injection

◦ Find controllers i andre assemblies: dynamisk? Fra database?

IActionInvoker: eksekverer actions/results◦ Håndter filtre anderledes

◦ Vælg anden view engine

IViewEngine: vælger view baseret på ActionResult◦ Led efter views på en ny måde

◦ Brug særlig markup (NHaml, Spark mv.)

ModelMetaDataProvider / ModelValidatorProvider

Det er kun begyndelsen…

Page 42: Mvc 1+2 Tech Talk 201003

42 Copenhagen Software24-03-2010

Statisk typede strenge

T4MVC

T4 template for MVC

Del af MVC Contrib på CodePlex

Kan hentes her: http://mvccontrib.codeplex.com/wikipage?title=T4MVC

Templaten genererer typer for strenge i et projekt

<%= Html.ActionLink(”View note”, ”Details", ”Notes",new { id = Model.Id }, null)%>

<%= Html.ActionLink(”View note", MVC.Note.Details(Model.Id))%>

return View(”Edit");return View(Views.Edit);

Page 43: Mvc 1+2 Tech Talk 201003

43 Copenhagen Software24-03-2010

Krav til miljø

Deployment

ASP.NET MVC består af en række assemblies, som blot kanbin-deployes:◦ System.Web.Routing.dll

◦ System.Web.Mvc.dll

◦ System.Web.Abstractions.dll

ASP.NET MVC kan køre på både IIS 6.0 og IIS 7.0, men sidstnævnte er mest velegnet◦ IIS 6.0 har udfordringer med extension-less routes

◦ IIS 7.0 kan med fordel benytte Integrated Pipeline

Kan også benyttes på Mono

MVC 1.0 og MVC 2.0 kan installeres side-by-side

Page 44: Mvc 1+2 Tech Talk 201003

44 Copenhagen Software24-03-2010

Hvordan kommer jeg videre?

ASP.NET MVC

www.asp.net/mvc

aspnet.codeplex.com

Officiel hjemmeside og CodePlex

Blogs

weblogs.asp.net/Scottgu

www.haacked.com

www.hanselman.com

MVCContrib

http://mvccontrib.codeplex.com

Page 45: Mvc 1+2 Tech Talk 201003

45 Copenhagen Software24-03-2010

Spørgsmål?

Copenhagen SoftwareSoftware as a Service konsulenter

www.copenhagensoftware.com

[email protected]