Iteam
GitHub

ASP.NET MVC 3 Razor - Snabbreferens

Efter en övergång till nya vymotorn Razor i MVC 3 så har det kommit upp några punkter som är bra att ha som referens eller bara för att komma igång.

Sektioner – Ersättare till asp: ContentPlaceHolder och asp:Content

Där man i vanliga WebForms vymotor tidigare använde sig av kontrollerna<asp: ContentPlaceHolder> och <asp:Content> för att byta ut innehåll dynamisk på olika delar av sidor så har Razor ett system med sektioner som används såhär:

_Layout.cshtml (Motsvarande .master-sida):

Page.cshtml:

Så för att bryta ner ovan så gör @RenderBody att sidans innehåll, som inte finns innanför ett@section-kodblock, skrivs ut på den platsen. Medan@RenderSection just rendrerar det som finns innanför matchande @section. Att andra argumentet i metoden ärfalse för att den sektionen inte ärrequired. Om den skulle vara true så skulle sidan krasha om inte den matchande sektionen fanns vid utritning.

Deklaration av ViewModel

I den gamla vymotorn var man för att ändra vilken vymodell som skulle användas skriva en lång rad kod i toppen av sidan,där ändå bara ett värde ändras:

Medan i Razor deklareras endast följande:

Kod i mitten av din HTML-kod

Om man tidigare ville göra en loop över data i sin vymodell, med lite logik i, och skriva ut dess värden såg det ut såhär:

Lite otydlig att läsa och ganska manga "arga getingar", som taggarna ibland kallas. Dettaförtydligas och förkortas rejält av Razor:

Med senaste versionerna av verktygen i Visual Studio så får alla @-tecknen väldigt tydlig färgkodning och är lätta att urskilja i sin HTML-kod.

Avancerad kod i mitten av HTML-kod

Razor är extremt smart på att avgöra vilka @-tecken som faktiskt är kod och vilka som är text, t.ex. för att skriva ut en email-adress, men framförallt är Razor väldigt smart när det gäller att förstå var kod slutar och tar slut.

Eftersom ett kolon inte kan skrivas efter en property i kod så förstår Razor att koden slutar där och text följer.

Om man vill vara tydlig, både i koden mot andra som ska läsa koden, men också mot Razor för att säga var något, som ska skrivas ut på sidan, börjar och startar använder man sig av parenteser:

Speciellt med IntelliSense blir detta väldigt läsbart vid snabb överblick.

Kod som inte skrivs ut på sidan

Om man vill skriva kod som inte skrivs ut på sidan, såsom temporära variabler eller annan logik som har med sidan att göra, men inte är innehåll så använder man sig av klammerparentes såhär:

Detta görs t.ex. i de mallarna man får med i nya MVC 3-projekt med Razor, i toppen av sidan för att sätta vilkenLayout som ska användas.

Man kan själv använda denna teknik för att styra innehållet i<title>-taggen mellan olika mallar:

Index.cshtml:

_Layout.cshtml:

Namnrymder

Väldigt enkelt och likt det gamla sättet. Man skriver bara följande överst på sidan:

Kommentarer

För att kommentera ut kod på serversidan, så att det inte alls kommer ut på klienten så används @""@ som syntax syntax:

Globala inställningar för vyer

Om du lägger en fil som heter '_ViewStart.cshtml' under '/Views'-mappen så kommerkoden som finns i den filen att köras i varje vy, först av allt. T.ex. kan du sätta globalt att Layout-mallen som ska användas av alla mallsidor, om inget annat sätts:

Ej enkodera innehåll

Med ASP.NET 4 kom nya taggar med kolon istället för likamedtecken när man ville skriva ut saker i mallar som skulle vara HTML-enkoderade.

När du använder @-tecknet i Razor så HTML-enkoderas allt som skrivs ut automatiskt. Men det är inte alltid det man vill och för att komma runt det använder man Html.Raw-funktionen såhär:

Sebastian Nilsson
2011-08-29