1. Microsoft ASP.NET
MVC 1+2
Stig Irming-Pedersen
24-03-2010 1 Copenhagen Software
2. Copenhagen Software
Software-
udvikling
Software as a Service Cloud Computing
(SaaS)
Forretnings-
udvikling
Software as a Service konsulenter
24-03-2010 2 Copenhagen Software
3. Copenhagen Software
• Har benyttet ASP.NET MVC siden Q1 2008
• Har leveret løsninger på ASP.NET MVC lige siden
Klimakonsortiets EnergyMap Health Group A/S‟ sundhedsportaler
www.energymap.dk www.wemove.dk
Erfaringer med MVC
24-03-2010 3 Copenhagen Software
4. 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
Hvad kommer der til at ske?
24-03-2010 4 Copenhagen Software
5. 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
Hvad er ASP.NET MVC?
24-03-2010 5 Copenhagen Software
6. ASP.NET
ASP.NET
Kontrolbibliotek
ASP.NET MVC
AJAX HTML URL håndtering • Solidt
• Skalerbart
• Omfattende
Caching Sessionshåndtering Sikkerhed Kontrolarkitektur
Databaseadgang Rettighedsstyring HTTP abstraktion Konfiguration
Hvad er ASP.NET MVC?
24-03-2010 6 Copenhagen Software
7. 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...
Hvorfor ASP.NET MVC?
24-03-2010 7 Copenhagen Software
8. Introduktion af ASP.NET MVC
Model:
Objekter som
View: repræsenterer de data
Markup som fortolkes applikationen arbejder
og vises af klienten med.
View Model
Applikation
Controller
Controller:
Håndterer input fra view
og interagerer med
modellen.
Model-view-controller
24-03-2010 8 Copenhagen Software
9. 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
Udvikling af CRUD applikation
24-03-2010 9 Copenhagen Software
10. Konventioner
www.domæne.dk/Product/Edit/123
public class ProductController : Controller
{
public ViewResult Edit(int id)
{
//Do something clever
}
}
~/view/Product/Edit.aspx
Controllers og actions
24-03-2010 10 Copenhagen Software
11. 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
Filer og typer
24-03-2010 11 Copenhagen Software
12. 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) %>
HTML Helpers
24-03-2010 12 Copenhagen Software
13. Opsummering
•URL‟er afbildes til actions i controllers
•Afbildning konfigureres, så URL‟er og filstruktur
URL er uafhængige
•En action er en public metode på en Controller
•En action tager imod input, udfører
Action forretningslogik og vælger et view
•WebForms bruges som view engine (.aspx)
•View‟et renderer HTML til klienten
View
MVC Pipeline
24-03-2010 13 Copenhagen Software
14. 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)
public ActionResult SomeAction()
URL
{
//Do something clever
}
Url.Action(”Action", ”Controller")
URL
Html.ActionLink(“Link text", <a href=”...”>
“Action", Link text
“Controller")
</a>
Routing og links
24-03-2010 14 Copenhagen Software
15. Data input
At indsamle input fra brugeren gøres i flere trin:
Returner HTML for Details(id)
POST Create(...data...)
Redirect til Details(id)
Returner <form>
GET Details(id)
GET Create()
GET / POST/ Redirect / GET
24-03-2010 15 Copenhagen Software
16. Data input
Hvis data ikke accepteres af serveren, ser det lidt anderledes ud:
Returner præ-udfyldt <form>
POST Create(...data...)
Returner <form>
GET Create()
GET / POST
24-03-2010 16 Copenhagen Software
17. 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)%>
eller
public ActionResult Create(string Title) public ActionResult Create(Note note)
{ {
//Validate and create //Validate and create
} }
Fra data input til model
24-03-2010 17 Copenhagen Software
18. 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());
Model binding
24-03-2010 18 Copenhagen Software
19. 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);
Test af controller actions
24-03-2010 19 Copenhagen Software
20. Validering
I ASP.NET Classic er validering blandet sammen med markup:
<asp:RegularExpressionValidator
ID="REV“ ControlToValidate="SomeControl"
ErrorMessage="Error!” ValidationExpression="d{10}"
runat="server" />
I ASP.NET MVC foretages validering i controlleren (eller endnu
bedre, i modellen!) og fejl registreres i Controller.ModelState:
private void ValidateNote(Note note) {
if (String.IsNullOrEmpty(note.Title)){
ModelState.AddModelError("Title", "Title required");
}
}
<%= Html.ValidationSummary("Please correct the errors and try again.") %>
<%= Html.ValidationMessage("Title", "*")%>
Server side validering
24-03-2010 20 Copenhagen Software
21. 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
Server side validering
24-03-2010 21 Copenhagen Software
22. MVC Pipeline
Vi har nu en CRUD applikation
Behandling af indkommende requests ser således ud
ActionResult
Routing vælger Model Model Action eksekveres
controller og action binding validering eksekveres (view
renderes)
Behandling af request
24-03-2010 22 Copenhagen Software
23. 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
Ny funktionalitet
24-03-2010 23 Copenhagen Software
24. 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(); %>
JavaScript validering
24-03-2010 24 Copenhagen Software
25. 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
<%@ 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():
<% Html.RenderPartial(”EditForm", Model); %>
Genbrug af markup
24-03-2010 25 Copenhagen Software
26. 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
Genbrug af logik
24-03-2010 26 Copenhagen Software
27. Templated helpers
Bruges til automatisk visning eller editering af objekter
Svarer til funktionalitet i Dynamic Data
Helper metoder er erklæret i
System.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()
Auto scaffolding
24-03-2010 27 Copenhagen Software
28. Templated helpers
Default templates kan overrides ved at nedarve fra
ViewUserControl
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
Overriding templates
24-03-2010 28 Copenhagen Software
29. 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]
Model meta data
24-03-2010 29 Copenhagen Software
30. 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
Inddeling i områder
24-03-2010 30 Copenhagen Software
31. 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 ved
venten 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
Optimering af threads forbrug
24-03-2010 31 Copenhagen Software
32. 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
Håndtering af HTTP verbs
24-03-2010 32 Copenhagen Software
33. Andre nyheder
Model validering erstatter input validering (alle egenskaber
valideres 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
ASP.NET MVC 2.0
24-03-2010 33 Copenhagen Software
35. 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>
Ajax Helpers
24-03-2010 35 Copenhagen Software
36. 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
jQuery
24-03-2010 36 Copenhagen Software
37. 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
ContentResult FileResult
HttpUnauthorized-
JSONResult
ViewResult Result RedirectResult Dit eget ActionResult
Renderer view Renderer ren Objekt serialiseret Redirect til URL
Returnerer fil HTTP Status code
som JSON
???
tekst 401
ActionResult typer
24-03-2010 37 Copenhagen Software
38. 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
Action Filters
24-03-2010 38 Copenhagen Software
39. Filters
IActionFilter:
Evalueres umiddelbart før og efter den tilhørende action metode
køres
public interface IActionFilter
{
void OnActionExecuted(ActionExecutedContext filterContext);
void OnActionExecuting(ActionExecutingContext filterContext);
}
IResultFilter:
Evalueres umiddelbart før og efter ActionResult‟et evalueres
public interface IResultFilter
{
void OnResultExecuted(ResultExecutedContext filterContext);
void OnResultExecuting(ResultExecutingContext filterContext);
}
Action Filters
24-03-2010 39 Copenhagen Software
40. MVC Pipeline
Routing
Model Model
URL vælger
binding validering
action
Authorize Action
Action filtre Action filtre
filtre eksekveres
ActionResult
Result filtre Result filtre
eksekveres
( View
eksekveres
)
Udvidet pipeline
24-03-2010 40 Copenhagen Software
41. 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…
Extension Points
24-03-2010 41 Copenhagen Software
42. 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);
Statisk typede strenge
24-03-2010 42 Copenhagen Software
43. Deployment
ASP.NET MVC består af en række assemblies, som blot kan
bin-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
Krav til miljø
24-03-2010 43 Copenhagen Software
44. ASP.NET MVC
Officiel hjemmeside og CodePlex
www.asp.net/mvc
aspnet.codeplex.com
MVCContrib
http://mvccontrib.codeplex.com
Blogs
weblogs.asp.net/Scottgu
www.haacked.com
www.hanselman.com
Hvordan kommer jeg videre?
24-03-2010 44 Copenhagen Software
45. Copenhagen Software
Software as a Service konsulenter
www.copenhagensoftware.com
mail@copenhagensoftware.com
Spørgsmål?
24-03-2010 45 Copenhagen Software