mvc 1+2 tech talk 201003
DESCRIPTION
An introduction to the ASP.NET MVC framework by SaaS consultants Copenhagen Software. In Danish.TRANSCRIPT
1 Copenhagen Software24-03-2010
Microsoft ASP.NETMVC 1+2
Stig Irming-Pedersen
2 Copenhagen Software24-03-2010
Software as a Service konsulenter
Copenhagen Software
Software-udvikling
Forretnings-udvikling
Cloud ComputingSoftware as a Service (SaaS)
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
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
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
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
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...
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
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
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
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
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) %>
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
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>
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>
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>
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
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());
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);
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.") %>
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
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)
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
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(); %>
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():
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
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()
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
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]
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
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
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
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
34 Copenhagen Software24-03-2010
Oversigt
Avanceret funktionalitet
1. AJAX
2. ActionResult
3. Filters
4. MVC Pipeline
5. Udvidbarhed
6. T4 templates
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>
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
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
???
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
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);
}
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( )
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…
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);
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
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
45 Copenhagen Software24-03-2010
Spørgsmål?
Copenhagen SoftwareSoftware as a Service konsulenter
www.copenhagensoftware.com