Deze morgen publiceerden we de Preview 3 build van het ASP.NET MVC framework. Ik blogde vorige maand gedetailleerd over een voorlopige broncode release waarin we verschillende veranderingen aangebracht hebben met deze Preview 3 release. De versie van vandaag bevat veel van de veranderingen in de Preview 3 release. De build van vandaag bevat ook bijkomende functies die niet aanwezig waren in de drop van vorige maand, enkele mooie verbeteringen en verfijningen alsook tool integratie in Visual Studio en documentatie.
Je kan hier een geintegreerd pakket van de ASP.NET MVC Preview 3 setup downloaden. Als je dat wil, kan je ook de ASP.NET MVC Preview 3 framework broncode en de framework unit tests hier downloaden.
Veranderingen in de Controller Action Method
ASP.NET MVC Preview 3 bevat de MVC Controller veranderingen die we eerder hebben besproken in de MVC broncode release van april, samen met enkele bijkomende aanpassingen.
Je kan action methods blijven schrijven die void retourneren en al hun logica in de action method vervatten. Bijvoorbeeld:
waardoor je de onderstaande HTML zou krijgen, wanneer uitgevoerd:
Preview 3 ondersteund nu ook het gebruik van een aanpak waarin je een "ActionResult" object retourneert dat het resultaat van de action methode aantoont en uitgestelde uitvoering mogelijk maakt. Hierdoor kan je veel eenvoudiger actions unit testen ("mocking" is in dit geval dus niet nodig). Ook wordt een veel schonere compositie en algemene control flow van de uitvoering mogelijk.
Bijvoorbeeld, we gebruiken LINQ to SQL in onze Browse action method om een sequentie van Product objecten te verkrijgen uit onze database en we duiden aan dat we er een View van willen krijgen. De onderstaande code zal drie onderdelen van "ViewData" doorsturen naar de view - "Title" en "CategoryName" stringwaarden, en een sterk getypeerde sequentie van producten (doorgestuurd als het ViewData.Model object):
Een duidelijk voordeel van de bovenstaande ActionResult aanpak is dat het unit testen van Controller actions heel eenvouidg wordt ("Mocking" is hier niet nodig). Hieronder zie je een unit test dat het gedrag van onze bovenstaande Browse action method nagaat:
We kunnen dan een "Browse" ViewPage creëren in de \Views\Products sub-directory om een antwoord te genereren met de ViewData waarin onze Browse action zich bevindt
Als we klikken op de /Products/Browse/Beverages URL, dan krijgen we een HTML antwoord zoals hieronder (de drie gebruiken van ViewData zijn omcirkeld in rood):
Merk op dat ASP.NET MVC Preview 3 naast de ondersteuning van een "ViewResult" antwoord (om aan te duiden dat een View gegereneerd moet worden), ook ondersteuning biedt om "JsonResult" te retourneren (voor AJAX JSON serialisatie scenario's), alsook ondersteuning voor "ContentResult" (om content te streamen zonder een View), HttpRedirect en RedirectToAction/Route resultaten.
De algemene ActionResut aanpak is uitbreidbaar (waardoor je je eigen resultaattypes kan creëren), en met de tijd zul je zien dat we nog meer resultaattypes zullen inbouwen.
Verbeterde HTML Helper Methods
De HTML helper methods zijn geupdate in ASP.NET MVC Preview 3. Naast een hoop bugherstellingen, bevatten ze ook een aantal mooie verbeteringen naar gebruiksvriendelijkheid toe.
Automatische Value Lookup
Zonder voorgaande preview releases moest je altijd expliciet de waarde invoegen om te kunnen genereren als je de Html helpers aanroept. Bijvoorbeeld: om een waarde te plaatsen in een <input type="text" value="some value"/> element, dan zou je het volgende schrijven:
De bovenstaande code werkt nog steeds, hoewel je ook gewoon het volgende kan schrijven::
De HTML helpers zal nu standaard het ViewData woordenboek en elk Model object controleren dat doorgestuurd is naar de view voor een ProductName keu of een property waarde om te gebruiken.
SelectList en MultiSelectList ViewModels
De HTML helpers bevatten nu nieuwe SelectList en MultiSelectList View-Model klassen en maken HTML dropdown's en multi-select listboxes veel schoner (en dingen zoals huidige selectie, enz.). Een aanpak die zorgt voor schonere formulierscenario's is om deze View-Model objecten te starten en te plaatsen in een controller action, om ze dan in het ViewDatawoordenboek te plaatsen voor de View.
Bijvoorbeeld, hieronder creëer ik een SelectList view-model klasse boven een set van unieke categorie objecten in onze database. Ik duid ook aan dat ik de "CategoryID" property wil gebruiken als de waarde van elk item in de lijst, en de "CategoryName" als display tekst. Ik plaats de lijstselectie ook op de huidige CategoryId van het product dat we editeren:
In onze view moeten we de onderstaande code schrijven om aan te duiden dat we een drop-down lijst willen creëren tegen de SelectList dat we in de ViewData plaatsen:
Hierdoor zal de gepaste dropdown gegenereerd worden met items en selectie tijdens de uitvoering:
Onze HTML helpers bevatten nog geen ingebouwde ondersteuning voor errorvalidatie (op dit moment moet je er nog code voor schrijven) - maar in de toekomst zal dit zeker ingebouwd worden, waardoor editeren van formulieren veel gemakkelijker zal worden.
Je zal ook zien dat er ASP.NET AJAX helper methods zullen verschijnen in toekomstige preview releases, waardoor je gemakkelijker AJAX zal kunnen integreren in MVC applicaties met een minimum aan code.
Verbeteringen voor URL Routing
ASP.NET MVC Preview 3 bevat een aantal verbeteringen aan het URL routing systeem. URL routing is een van de meest fundamentele componenten van een web MVC framework. Daarom hebben we ons er zo intens op gericht dat dit deelgebied helemaal goed zat in de eerste paar previews. Onze nieuwe URL routing motor zal uitgebracht worden in .NET 3.5 SP1 deze zomer, en zal ondersteuning bieden voor zowel Web Formulieren als MVC verzoeken. ASP.NET MVC zal in staat zijn om de ingebouwde .NET 3.5 SP1 routing motor te gebruiken wanneer uitgevoerd op .NET 3.5 SP1. ASP.NET MVC zal ook een eigen versie hebben van die assembly zodat het ook kan werken op non-SP1 systemen.
Enkele verbeteringen aan de URL Routing in de Preview 3 release:
MapRoute() en gnoreRoute() helper methods
ASP.NET MVC Preview 3 bevat nieuwe "MapRoute" en "IgnoreRoute" helper methods die je kan gebruiken om gemakkelijker route regels te kunnen registereren. MapRoute() biedt een gemakkelijke manier om een nieuwe MVC Route regel toe te voegen aan de collectie van Routes. IgnoreRoute() biedt een gemakkelijke manier om het URL routing systeem duidelijk te maken om dat het moet stoppen met bepaalde URL patronen te verwerken (fbijvoorbeeld:: handler .axd resources in ASP.NET die gebruikt worden om JavaScript, images, etc te gebruiken).
Hieronder vind je een voorbeeld van de standaard RegisterRoutes() method in Global.asax wanneer je een nieuw ASP.NET MVC project creëert waarin je beide nieuwe helper methodes in actie kan zien:
De MapRoute() helper method is overloaded and takes two, three or four parameters (route name, URL syntax, URL parameter default, and optional URL parameter regular expression constraints).
You can call MapRoute() as many times as you want to register multiple named routes in the system. For example, in addition to the default convention rule, we could add a "Products-Browse" named routing rule like below:

We kunnen dan expliciet verwijzen naar deze "Products-Browse" regel in onze Controllers en Views als we een URL ernaar willen genereren. Bijvoorbeeld, we gebruiken de Html.RouteLink view helper om aan te duiden dat we willen linken naar onze "Product-Browse" route en we geven het een "Food" categorie parameter met behulp van code in onze view template zoals hieronder:

Deze view helper gaat dan het routing systeem binnen en zou een output geven van een gepaste HTML hyperlink URL zoals hieronder (merk op hoe het automatisch parametervervanging toepast van de categorie parameter in de URL met de route regel):

We zouden ook de nieuwe Url.RouteUrl(routeName, values) kunnen gebruiken in views als we alleen de URL wilden opvragen voor een benoemde route (en niet een <a> html element output).
We zouden ook de nieuwe RedirectToRoute(routeName, values) helper methode kunnen gebruiken op de Controller base class om browser redirects te realiseren gebaseerd op de benoemde routing regels.
Rijkere URL Route Mapping Functies
ASP.NET MVC Preview 3 ondersteunt ook een aantal nieuwe URL route mapping functies. Je kan nu ook "-", ".", ";" gebruiken of elk ander karakter die je wil als onderdeel van je routeregels.
Bijvoorbeeld, als je een "-" scheidingsteken wil gebruiken, dan kan je nu de taal- en localewaarden afzonderlijk parsen van je URLS met behulp van een regel zoals hieronder:

Hierdoor zouden gepaste "language", "locale", en "category" parameters naar een ProductsController.Browse action method gestuurd worden wanneer aangeroepen:
| URL Route Rule |
Example URL |
Parameters Passed to Action method |
| {language}-{locale}/products/browse/{category} |
/en-us/products/browse/food |
language=en, locale=us, category=food |
| |
/en-uk/products/browse/food |
language=en, locale=uk, category=food |
Of je kan het "." bestandsextentie type gebruiken op het einde van een url om te bepalen of je het resultaat in XML of in HTML formaat wil laten genereren:

Hierdoor zouden zowel de "category" en de "format" parameters naar de ProductsController.Browse action method gestuurd worden, wanneer aangeroepen:
| URL Route Rule |
Example URL |
Parameters Passed to Action method |
| products/browse/{category}.{format} |
/products/browse/food.xml |
category=food, format=xml |
| |
/products/browse/food.html |
category=food, format=html |
ASP.NET MVC Preview 3 ondersteunt ook wildcard routeregels (die ook in Preview 2 aanwezig waren). Bijvoorbeeld, je kan in een regel aanduiden dat je alle overblijvende URI content will doorsturen naar een action method als een benoemde parameter:
Hierdoor zou een "contentUrl" parameter naar de WikiController.DisplayPage action method worden gestuurd wanneer aangeroepen:
| URL Route Rule |
Example URL |
Parameters Passed to Action method |
| Wiki/Pages/{*contentUrl} |
/Wiki/Pages/People/Scott |
contentUrl="People/Scott" |
| |
/Wiki/Pages/Countries/UK |
contentUrl="Countries/UK" |
Deze wildcard routes zijn heel nuttig als je eraan denkt een wiki, blog, cms of ander contentbased systeem te bouwen.
Samenvatting
De Preview 3 release of ASP.NET MVC van vandaag, bevat een hele reeks verbeteringen en verfijningen. Meer en meer krijgen we een goed gevoel over het URL routing en Controller/Action programmeermodel van MVC. We merken dat die deelgebieden heel goed beginnen te boeren. In toekomstige releases zal je meer verbeteringen zien in de hogere tredes van de programmeerladder in gebieden als Views (html helpers, validation helpers, etc), AJAX, sub-controllers en site composition, deeper Login, Authenticatie, Authorisatie en Caching integratie, alsook data scaffolding ondersteuning.
Ik heb ook nog een (zeer) lange tutorialpost dat ik ben beginnen schrijven in het afgelopen weekend, waarin ik gedetailleerd alle stappen overloop om een applicatie te bouwen met ASP.NET MVC Preview 3. Ik hoop dat ik die tutorial snel afheb, zodat ik het de komende dagen kan posten. Dit zou een goede intro moeten zijn van ASP.NET MVC, maar ook een hulp om je wat meer context te bieden rond hoe alle onderdelen een geheel vormen, als je interesse hebt om de ASP.NET MVC optie te gebruiken.
Ik hoop dat jullie hiermee aan de slag kunnen,
Scott