RazorReferenční informace k syntaxi pro ASP.NET Core
Od Ricka Andersona, Vychytáka A. A Dana Vicarela.
Razor je syntaxe značek pro vkládání kódu založeného na .NET do webových stránek. Syntaxe Razor se skládá z Razor kódu, jazyka C# a HTML. Soubory obsahující Razor obvykle mají .cshtml příponu souboru. Razornajdete také v Razor souborech komponent ( .razor ). RazorSyntaxe se podobá šablonám různých architektur jedno stránkových aplikací (SPA) JavaScriptu, jako jsou Angular, React, VueJs a Svelte. Další informace najdete v tématu Použití služeb JavaScriptu k vytváření aplikací s jedním stránkou v ASP.NET Core.
Vykreslování HTML
Výchozí jazyk Razor je HTML. Vykreslování HTML z Razor kódu se neliší od vykreslování HTML ze souboru HTML. Kód HTML v .cshtml Razor souborech je vykreslován serverem beze změny.
Razor Syntaxe
Razor podporuje jazyk C# a @ používá symbol k přechodu z HTML na jazyk C#. Razor vyhodnotí výrazy jazyka C# a vykreslí je ve výstupu HTML.
Pokud za symbolem následuje vyhrazené klíčové @ Razor slovo, přechází na Razor kód specifický pro konkrétní typ. V opačném případě přechází na prostý kód HTML.
Pokud chcete řídicí @ symbol ve Razor značce, použijte druhý @ symbol:
<p>@@Username</p>
Kód se vykreslí v HTML s jedním @ symbolem:
<p>@Username</p>
Atributy HTML a obsah obsahující e-mailové adresy se symbolem nezachází @ jako s přechodovým znakem. E-mailové adresy v následujícím příkladu jsou při Razor analýze nezměněné:
<a href="mailto:Support@contoso.com">Support@contoso.com</a>
SVG (Scalable Vector Graphics)
Podporují se elementy cizích objektů SVG:
@{
string message = "foreignObject example with Scalable Vector Graphics (SVG)";
}
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" rx="10" ry="10" width="200" height="200" stroke="black"
fill="none" />
<foreignObject x="20" y="20" width="160" height="160">
<p>@message</p>
</foreignObject>
</svg>
Implicitní Razor výrazy
Implicitní Razor výrazy začínají @ kódem jazyka C#:
<p>@DateTime.Now</p>
<p>@DateTime.IsLeapYear(2016)</p>
S výjimkou klíčového slova C# await nesmí implicitní výrazy obsahovat mezery. Pokud má příkaz jazyka C# jasný konec, mohou být mezery prokládané:
<p>@await DoSomething("hello", "world")</p>
Implicitní výrazy nesmí obsahovat obecné typy jazyka C#, protože znaky uvnitř závorek ( ) jsou <> interpretovány jako značka HTML. Následující kód není platný:
<p>@GenericMethod<int>()</p>
Předchozí kód vygeneruje chybu kompilátoru podobnou jedné z následujících:
- Prvek "int" nebyl uzavřen. Všechny prvky musí být buď samouvírací, nebo musí mít odpovídající koncovou značku.
- Skupinu metod GenericMethod nelze převést na typ object bez delegáta. Máte v úmyslu vyvolat metodu ?
Volání obecných metod musí být zabalena do Razor explicitního výrazu nebo Razor bloku kódu.
Explicitní Razor výrazy
Explicitní Razor výrazy se skládají @ ze symbolu s vyváženou závorkou. K vykreslení času z minulého týdne se používá Razor následující kód:
<p>Last week this time: @(DateTime.Now - TimeSpan.FromDays(7))</p>
Jakýkoli obsah v @() závorkách se vyhodnotí a vykreslí do výstupu.
Implicitní výrazy popsané v předchozí části obecně nesmí obsahovat mezery. V následujícím kódu se jeden týden neodčítá od aktuálního času:
<p>Last week: @DateTime.Now - TimeSpan.FromDays(7)</p>
Kód vykreslí následující kód HTML:
<p>Last week: 7/7/2016 4:39:52 PM - TimeSpan.FromDays(7)</p>
Explicitní výrazy lze použít ke zřetězit text s výsledkem výrazu:
@{
var joe = new Person("Joe", 33);
}
<p>Age@(joe.Age)</p>
Bez explicitního výrazu <p>Age@joe.Age</p> se zachází jako s e-mailovou adresou a <p>Age@joe.Age</p> vykreslí se. Při zápisu jako explicitní výraz se <p>Age33</p> vykreslí .
Explicitní výrazy lze použít k vykreslení výstupu z obecných metod v .cshtml souborech. Následující kód ukazuje, jak opravit chybu zobrazenou dříve způsobenou závorkami obecného jazyka C#. Kód je napsán jako explicitní výraz:
<p>@(GenericMethod<int>())</p>
Kódování výrazů
Výrazy jazyka C#, které se vyhodnotí jako řetězec, jsou kódovány ve formátu HTML. Výrazy jazyka C#, které se IHtmlContent vyhodnotí jako , se vykreslují přímo prostřednictvím IHtmlContent.WriteTo . Výrazy jazyka C#, které se nevyhodnotí jako , se před vykreslení převedou na řetězec IHtmlContent a zakódují. ToString
@("<span>Hello World</span>")
Předchozí kód vykreslí následující kód HTML:
<span>Hello World</span>
Kód HTML se v prohlížeči zobrazí jako prostý text:
<span > Hello World < /span>
HtmlHelper.Raw výstup není kódovaný, ale vykreslený jako kód HTML.
Upozornění
Použití HtmlHelper.Raw u nesanitizovaného uživatelského vstupu je bezpečnostním rizikem. Uživatelský vstup může obsahovat škodlivý JavaScript nebo jiné zneužití. Sanitizace uživatelského vstupu je obtížná. Nepoužívejte s HtmlHelper.Raw uživatelským vstupem.
@Html.Raw("<span>Hello World</span>")
Kód vykreslí následující kód HTML:
<span>Hello World</span>
Razor bloky kódu
Razor Bloky kódu začínají na a @ jsou uzavřeny pomocí {} . Na rozdíl od výrazů se kód C# uvnitř bloků kódu nevykreslí. Bloky kódu a výrazy v zobrazení sdílejí stejný obor a jsou definovány v pořadí:
@{
var quote = "The future depends on what you do today. - Mahatma Gandhi";
}
<p>@quote</p>
@{
quote = "Hate cannot drive out hate, only love can do that. - Martin Luther King, Jr.";
}
<p>@quote</p>
Kód vykreslí následující kód HTML:
<p>The future depends on what you do today. - Mahatma Gandhi</p>
<p>Hate cannot drive out hate, only love can do that. - Martin Luther King, Jr.</p>
V blocích kódu deklarujte místní funkce s kódem, který slouží jako metody šablonování:
@{
void RenderName(string name)
{
<p>Name: <strong>@name</strong></p>
}
RenderName("Mahatma Gandhi");
RenderName("Martin Luther King, Jr.");
}
Kód vykreslí následující kód HTML:
<p>Name: <strong>Mahatma Gandhi</strong></p>
<p>Name: <strong>Martin Luther King, Jr.</strong></p>
Implicitní přechody
Výchozí jazyk v bloku kódu je C#, ale Razor stránka může přejít zpět do HTML:
@{
var inCSharp = true;
<p>Now in HTML, was in C# @inCSharp</p>
}
Explicitní přechod s oddělovači
Pokud chcete definovat pododdíl bloku kódu, který by měl vykreslit KÓD HTML, ohraničte znaky pro vykreslení Razor <text> značkou :
@for (var i = 0; i < people.Length; i++)
{
var person = people[i];
<text>Name: @person.Name</text>
}
Tento přístup použijte k vykreslení kódu HTML, který není omeován značkou HTML. Bez kódu HTML Razor nebo značky dojde k chybě modulu Razor runtime.
Značka <text> je užitečná k řízení prázdných znaky při vykreslování obsahu:
- Vykreslí se jenom
<text>obsah mezi značkou. - Ve výstupu HTML se nezobrazí žádné prázdné znaky před nebo
<text>po značce.
Explicitní přechod řádku
Pokud chcete zbytek celého řádku vykreslit jako HTML uvnitř bloku kódu, použijte @: syntaxi:
@for (var i = 0; i < people.Length; i++)
{
var person = people[i];
@:Name: @person.Name
}
Bez @: v kódu se Razor vygeneruje chyba modulu runtime.
Další @ znaky v Razor souboru mohou způsobit chyby kompilátoru v příkazy dále v bloku. Tyto chyby kompilátoru mohou být obtížně pochopitelné, protože skutečná chyba se vyskytuje před nahlášenou chybou. Tato chyba je běžná po zkombinování více implicitních/explicitních výrazů do jednoho bloku kódu.
Řídicí struktury
Řídicí struktury jsou rozšířením bloků kódu. Všechny aspekty bloků kódu (přechod na značky, vložený kód C#) platí také pro následující struktury:
Podmíněné výrazy @if, else if, else, and @switch
@if řídí při spuštění kódu:
@if (value % 2 == 0)
{
<p>The value was even.</p>
}
else``else ifa symbol @ nevyžadují:
@if (value % 2 == 0)
{
<p>The value was even.</p>
}
else if (value >= 1337)
{
<p>The value is large.</p>
}
else
{
<p>The value is odd and small.</p>
}
Následující kód ukazuje, jak použít příkaz switch:
@switch (value)
{
case 1:
<p>The value is 1!</p>
break;
case 1337:
<p>Your number is 1337!</p>
break;
default:
<p>Your number wasn't 1 or 1337.</p>
break;
}
Opakování @for, @foreach, @while, and @do while
Html s šablonou se může vykreslit pomocí řídicích příkazů smyčky. Zobrazení seznamu osob:
@{
var people = new Person[]
{
new Person("Weston", 33),
new Person("Johnathon", 41),
...
};
}
Podporují se následující příkazy smyčky:
@for
@for (var i = 0; i < people.Length; i++)
{
var person = people[i];
<p>Name: @person.Name</p>
<p>Age: @person.Age</p>
}
@foreach
@foreach (var person in people)
{
<p>Name: @person.Name</p>
<p>Age: @person.Age</p>
}
@while
@{ var i = 0; }
@while (i < people.Length)
{
var person = people[i];
<p>Name: @person.Name</p>
<p>Age: @person.Age</p>
i++;
}
@do while
@{ var i = 0; }
@do
{
var person = people[i];
<p>Name: @person.Name</p>
<p>Age: @person.Age</p>
i++;
} while (i < people.Length);
Složené @using
V jazyce C# se k zajištění uvolnění objektu using používá příkaz . V systému se stejný mechanismus používá k vytvoření pomocných prvků Razor HTML, které obsahují další obsah. V následujícím kódu vykreslí helpery HTML <form> značku s @using příkazem :
@using (Html.BeginForm())
{
<div>
Email: <input type="email" id="Email" value="">
<button>Register</button>
</div>
}
@try, catch, finally
Zpracování výjimek je podobné jazyce C#:
@try
{
throw new InvalidOperationException("You did something invalid.");
}
catch (Exception ex)
{
<p>The exception message: @ex.Message</p>
}
finally
{
<p>The finally statement.</p>
}
@lock
Razor má schopnost chránit kritické oddíly pomocí příkazů lock:
@lock (SomeLock)
{
// Do critical section work
}
Komentáře
Razor podporuje komentáře jazyka C# a HTML:
@{
/* C# comment */
// Another C# comment
}
<!-- HTML comment -->
Kód vykreslí následující kód HTML:
<!-- HTML comment -->
Razor Server před vykreslením webové stránky odebere komentáře. Razor používá @* *@ k oddělení komentářů. Následující kód je zakomentovaný, takže server nevykreslí žádné značky:
@*
@{
/* C# comment */
// Another C# comment
}
<!-- HTML comment -->
*@
Direktivy
Razor Direktivy jsou reprezentovány implicitními výrazy s vyhrazenými klíčovými slovy za @ symbolem. Direktiva obvykle mění způsob analýzy zobrazení nebo umožňuje různé funkce.
Pochopení Razor způsobu, jakým generuje kód pro zobrazení, usnadňuje pochopení toho, jak direktivy fungují.
@{
var quote = "Getting old ain't for wimps! - Anonymous";
}
<div>Quote of the Day: @quote</div>
Kód vygeneruje třídu podobnou následující:
public class _Views_Something_cshtml : RazorPage<dynamic>
{
public override async Task ExecuteAsync()
{
var output = "Getting old ain't for wimps! - Anonymous";
WriteLiteral("/r/n<div>Quote of the Day: ");
Write(output);
WriteLiteral("</div>");
}
}
Dále v tomto článku část Kontrola vygenerované třídy Razor jazyka C# pro zobrazení vysvětluje, jak tuto vygenerované třídu zobrazit.
@attribute
Direktiva @attribute přidá daný atribut do třídy vygenerované stránky nebo zobrazení. Následující příklad přidá [Authorize] atribut :
@attribute [Authorize]
@code
Tento scénář se týká pouze Razor komponent ( .razor ).
Blok @code umožňuje Razor komponentě přidat do součásti členy jazyka C# (pole, vlastnosti a metody):
@code {
// C# members (fields, properties, and methods)
}
Pro Razor komponenty je alias a @code @functions doporučenou pro @functions . Přípustné je @code více než jeden blok.
@functions
Direktiva @functions umožňuje přidání členů jazyka C# (polí, vlastností a metod) do vygenerované třídy:
@functions {
// C# members (fields, properties, and methods)
}
V Razor komponentách @code přidejte členy @functions jazyka C# pomocí funkce over.
Například:
@functions {
public string GetHello()
{
return "Hello";
}
}
<div>From method: @GetHello()</div>
Kód vygeneruje následující kód HTML:
<div>From method: Hello</div>
Následující kód je vygenerovaná třída Razor jazyka C#:
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Razor;
public class _Views_Home_Test_cshtml : RazorPage<dynamic>
{
// Functions placed between here
public string GetHello()
{
return "Hello";
}
// And here.
#pragma warning disable 1998
public override async Task ExecuteAsync()
{
WriteLiteral("\r\n<div>From method: ");
Write(GetHello());
WriteLiteral("</div>\r\n");
}
#pragma warning restore 1998
@functions Metody slouží jako metody šablonování, pokud mají značky:
@{
RenderName("Mahatma Gandhi");
RenderName("Martin Luther King, Jr.");
}
@functions {
private void RenderName(string name)
{
<p>Name: <strong>@name</strong></p>
}
}
Kód vykreslí následující kód HTML:
<p>Name: <strong>Mahatma Gandhi</strong></p>
<p>Name: <strong>Martin Luther King, Jr.</strong></p>
@implements
Direktiva @implements implementuje rozhraní pro vygenerované třídy.
Následující příklad implementuje System.IDisposable metodu , aby Dispose bylo možné volat metodu :
@implements IDisposable
<h1>Example</h1>
@functions {
private bool _isDisposed;
...
public void Dispose() => _isDisposed = true;
}
@inherits
Direktiva @inherits poskytuje úplnou kontrolu nad třídou, kterou zobrazení dědí:
@inherits TypeNameOfClassToInheritFrom
Následující kód je vlastní Razor typ stránky:
using Microsoft.AspNetCore.Mvc.Razor;
public abstract class CustomRazorPage<TModel> : RazorPage<TModel>
{
public string CustomText { get; } =
"Gardyloo! - A Scottish warning yelled from a window before dumping" +
"a slop bucket on the street below.";
}
V CustomText zobrazení se zobrazí :
@inherits CustomRazorPage<TModel>
<div>Custom text: @CustomText</div>
Kód vykreslí následující kód HTML:
<div>
Custom text: Gardyloo! - A Scottish warning yelled from a window before dumping
a slop bucket on the street below.
</div>
@model``@inheritsa lze použít ve stejném zobrazení. @inherits může být v _ViewImports.cshtml souboru, který importuje zobrazení:
@inherits CustomRazorPage<TModel>
Následující kód je příkladem zobrazení silného typu:
@inherits CustomRazorPage<TModel>
<div>The Login Email: @Model.Email</div>
<div>Custom text: @CustomText</div>
Pokud se rick@contoso.com v modelu předá " ", zobrazení vygeneruje následující kód HTML:
<div>The Login Email: rick@contoso.com</div>
<div>
Custom text: Gardyloo! - A Scottish warning yelled from a window before dumping
a slop bucket on the street below.
</div>
@inject
Direktiva @inject umožňuje page vložit službu z Razor kontejneru služby do zobrazení. Další informace najdete v tématu Injektáž závislostí do zobrazení.
@layout
Tento scénář se týká pouze Razor komponent ( .razor ).
Direktiva @layout určuje rozložení pro směrovatelné Razor součásti, které mají @page direktivu . Komponenty rozložení se používají k zabránění duplikaci a nekonzistence kódu. Další informace naleznete v tématu BlazorASP.NET Core Rozložení.
@model
Tento scénář se týká pouze zobrazení MVC a Razor stránek ( .cshtml ).
Direktiva @model určuje typ modelu předané zobrazení nebo stránce:
@model TypeNameOfModel
V aplikaci ASP.NET Core MVC nebo Pages vytvořené s jednotlivými uživatelskými účty Razor Views/Account/Login.cshtml obsahuje následující deklaraci modelu:
@model LoginViewModel
Vygenerovaná třída dědí z RazorPage<dynamic> :
public class _Views_Account_Login_cshtml : RazorPage<LoginViewModel>
Razor zpřístupňuje Model vlastnost pro přístup k modelu předamu do zobrazení:
<div>The Login Email: @Model.Email</div>
Direktiva @model určuje typ Model vlastnosti . Direktiva určuje v T RazorPage<T> , že vygenerovaná třída, ze které je zobrazení odvozeno. Pokud @model není direktiva zadána, Model je vlastnost typu dynamic . Další informace najdete v tématu Modely se silnými typy a klíčové @model slovo.
@namespace
Direktiva @namespace :
- Nastaví obor názvů třídy vygenerované Razor stránky, zobrazení MVC nebo Razor komponenty.
- Nastaví kořenové odvozené obory názvů tříd stránek, zobrazení nebo komponent z nejbližšího souboru importu v adresářovém stromu (zobrazení nebo
_ViewImports.cshtmlstránky) nebo _Imports.razor ( Razor součásti).
@namespace Your.Namespace.Here
Příklad Razor Pages zobrazený v následující tabulce:
- Každá stránka importuje
Pages/_ViewImports.cshtml. Pages/_ViewImports.cshtmlobsahuje@namespace Hello.World.- Každá stránka má
Hello.Worldjako kořen oboru názvů .
| Stránka | Obor názvů |
|---|---|
Pages/Index.cshtml |
Hello.World |
Pages/MorePages/Page.cshtml |
Hello.World.MorePages |
Pages/MorePages/EvenMorePages/Page.cshtml |
Hello.World.MorePages.EvenMorePages |
Předchozí relace se vztahují na import souborů používaných se zobrazeními a komponentami Razor MVC.
Pokud má direktivu více souborů importu, použije se soubor, který je nejblíže stránce, zobrazení nebo komponentě v adresářovém stromu, k nastavení @namespace kořenového oboru názvů.
Pokud má složka v předchozím příkladu soubor imports se znakem (nebo soubor obsahuje ), výsledek je uveden EvenMorePages @namespace Another.Planet v následující Pages/MorePages/EvenMorePages/Page.cshtml @namespace Another.Planet tabulce.
| Stránka | Obor názvů |
|---|---|
Pages/Index.cshtml |
Hello.World |
Pages/MorePages/Page.cshtml |
Hello.World.MorePages |
Pages/MorePages/EvenMorePages/Page.cshtml |
Another.Planet |
@page
Direktiva @page má různé účinky v závislosti na typu souboru, ve kterém se zobrazí. Direktiva :
- Soubor
.cshtmlv souboru označuje, že je to Razor stránka. Další informace najdete v tématu Vlastní trasy a Úvod do Razor stránek v ASP.NET Core . - Určuje, že má Razor komponenta zpracovávat požadavky přímo. Další informace naleznete v tématu ASP.NET Core Blazor úsek.
@preservewhitespace
Tento scénář se týká pouze Razor komponent ( .razor ).
Při nastavení na (výchozí) se prázdné znaky ve vykreslené značce false z komponent ( ) Razor .razor odebraly, pokud:
- Počáteční nebo koncové v rámci elementu.
- Počáteční nebo koncové hodnoty v
RenderFragmentrámci parametru. Například podřízený obsah předaný jiné komponentě. - Předchází nebo následuje blok kódu jazyka C#, například
@ifnebo@foreach.
@section
Tento scénář se týká pouze zobrazení MVC a Razor stránek ( .cshtml ).
Direktiva @section se používá ve spojení s rozloženími MVC Razor a Pages a umožňuje zobrazením nebo stránkám vykreslovat obsah v různých částech stránky HTML. Další informace naleznete v tématu Rozložení v ASP.NET Core.
@using
Direktiva @using přidá do using vygenerované zobrazení direktivu C#:
@using System.IO
@{
var dir = Directory.GetCurrentDirectory();
}
<p>@dir</p>
V Razor komponentách @using také určuje, které komponenty jsou v oboru.
Atributy direktiv
Razor Atributy direktiv jsou reprezentovány implicitními výrazy s vyhrazenými klíčovými slovy za @ symbolem . Atribut direktivy obvykle mění způsob, jakým se element parsuje nebo umožňuje různé funkce.
@attributes
Tento scénář se týká pouze Razor komponent ( .razor ).
@attributes umožňuje komponentě vykreslit ne deklarované atributy. Další informace naleznete v tématu RazorASP.NET Core Součásti.
@bind
Tento scénář se týká pouze Razor komponent ( .razor ).
Datové vazby v komponentách se provádí pomocí @bind atributu . Další informace naleznete v tématu BlazorASP.NET Core datová vazba.
@bind:culture
Tento scénář se týká pouze Razor komponent ( .razor ).
Pomocí @bind:culture atributu @bind s atributem můžete zadat pro System.Globalization.CultureInfo parsování a formátování hodnoty. Další informace naleznete v tématu ASP.NET Core Blazor globalizace a lokalizace.
@on{EVENT}
Tento scénář se týká pouze Razor komponent ( .razor ).
Razor poskytuje součásti funkce zpracování událostí. Další informace naleznete v tématu ASP.NET Core Blazor zpracování událostí.
@on{EVENT}:preventDefault
Tento scénář se týká pouze Razor komponent ( .razor ).
Zabrání výchozí akci události.
@on{EVENT}:stopPropagation
Tento scénář platí pouze pro Razor součásti ( .razor ).
Zastaví šíření události pro událost.
@key
Tento scénář platí pouze pro Razor součásti ( .razor ).
@keyAtribut direktiva způsobí, že rozdílový algoritmus komponent garantuje zachování prvků nebo komponent na základě hodnoty klíče. Další informace naleznete v tématu RazorASP.NET Core Součásti.
@ref
Tento scénář platí pouze pro Razor součásti ( .razor ).
Odkazy na součásti ( @ref ) poskytují způsob, jak odkazovat na instanci komponenty, abyste mohli vydávat příkazy do této instance. Další informace naleznete v tématu RazorASP.NET Core Součásti.
@typeparam
Tento scénář platí pouze pro Razor součásti ( .razor ).
@typeparamDirektiva deklaruje parametr obecného typu pro generovanou třídu komponenty:
@typeparam TEntity
Podporují se obecné typy s where omezeními typu:
@typeparam TEntity where TEntity : IEntity
Další informace najdete v následujících článcích:
@typeparam
Tento scénář platí pouze pro Razor součásti ( .razor ).
@typeparamDirektiva deklaruje parametr obecného typu pro generovanou třídu komponenty:
@typeparam TEntity
Další informace najdete v následujících článcích:
Zástupci přidaných šablon Razor
Razor šablony umožňují definovat fragment uživatelského rozhraní v následujícím formátu:
@<tag>...</tag>
Následující příklad ukazuje, jak zadat delegáta s šablonou Razor jako Func<T,TResult> . Dynamický typ je zadán pro parametr metody, kterou delegát zapouzdřuje. Typ objektu je zadán jako návratová hodnota delegáta. Šablona se používá s List<T> Pet vlastností, která má Name vlastnost.
public class Pet
{
public string Name { get; set; }
}
@{
Func<dynamic, object> petTemplate = @<p>You have a pet named <strong>@item.Name</strong>.</p>;
var pets = new List<Pet>
{
new Pet { Name = "Rin Tin Tin" },
new Pet { Name = "Mr. Bigglesworth" },
new Pet { Name = "K-9" }
};
}
Šablona je vykreslena s pets dodaným foreach příkazem:
@foreach (var pet in pets)
{
@petTemplate(pet)
}
Vykreslený výstup:
<p>You have a pet named <strong>Rin Tin Tin</strong>.</p>
<p>You have a pet named <strong>Mr. Bigglesworth</strong>.</p>
<p>You have a pet named <strong>K-9</strong>.</p>
Vloženou šablonu můžete také dodat Razor jako argument metodě. V následujícím příkladu Repeat metoda obdrží Razor šablonu. Metoda používá šablonu k vytvoření obsahu HTML s opakováním položek dodaných ze seznamu:
@using Microsoft.AspNetCore.Html
@functions {
public static IHtmlContent Repeat(IEnumerable<dynamic> items, int times,
Func<dynamic, IHtmlContent> template)
{
var html = new HtmlContentBuilder();
foreach (var item in items)
{
for (var i = 0; i < times; i++)
{
html.AppendHtml(template(item));
}
}
return html;
}
}
Pomocí seznamu domácích zvířat z předchozího příkladu Repeat je metoda volána s:
- List<T> z
Pet. - Počet opakování každé PET.
- Vložená šablona, která se má použít pro položky seznamu neuspořádaného seznamu
<ul>
@Repeat(pets, 3, @<li>@item.Name</li>)
</ul>
Vykreslený výstup:
<ul>
<li>Rin Tin Tin</li>
<li>Rin Tin Tin</li>
<li>Rin Tin Tin</li>
<li>Mr. Bigglesworth</li>
<li>Mr. Bigglesworth</li>
<li>Mr. Bigglesworth</li>
<li>K-9</li>
<li>K-9</li>
<li>K-9</li>
</ul>
Pomocné rutiny značek
Tento scénář platí jenom pro zobrazení MVC a Razor stránky ( .cshtml ).
Existují tři direktivy, které se týkají pomocníků značek.
| Směrnici | Funkce |
|---|---|
@addTagHelper |
Zpřístupní pomocníkům značek zobrazení. |
@removeTagHelper |
Odebere pomocníky značek dříve přidané ze zobrazení. |
@tagHelperPrefix |
Určuje předponu značky pro povolení podpory značek pomocníka a k explicitnímu použití pomocníka značek. |
Razor vyhrazená klíčová slova
Razor klíčov
page(vyžaduje ASP.NET Core 2,1 nebo novější)namespacefunctionsinheritsmodelsectionhelper(Aktuálně není podporováno ASP.NET Core)
Razor Klíčová slova jsou uvozena znakem @(Razor Keyword) (například @(functions) ).
RazorKlíčová slova jazyka C#
casedodefaultforforeachifelselockswitchtrycatchfinallyusingwhile
RazorKlíčová slova jazyka C# musí mít dvojité uvození řídicím znakem @(@C# Razor Keyword) (například @(@case) ). První @ řídí Razor analyzátor. Druhý @ řídí analyzátor jazyka C#.
Vyhrazená klíčová slova, která nepoužívá Razor
class
Kontrola Razor třídy jazyka C# vygenerované pro zobrazení
Razor Sada SDK zpracovává kompilaci Razor souborů. Při sestavování projektu Razor generuje sada SDK obj/<build_configuration>/<target_framework_moniker>/Razor adresář v kořenu projektu. Adresářová struktura v Razor adresáři zrcadlí strukturu adresáře projektu.
vezměte v úvahu následující adresářovou strukturu v Razor projektu ASP.NET Core stránky:
Areas/
Admin/
Pages/
Index.cshtml
Index.cshtml.cs
Pages/
Shared/
_Layout.cshtml
_ViewImports.cshtml
_ViewStart.cshtml
Index.cshtml
Index.cshtml.cs
Sestavení projektu v konfiguraci ladění vede k následujícímu obj adresáři:
obj/
Debug/
netcoreapp2.1/
Razor/
Areas/
Admin/
Pages/
Index.g.cshtml.cs
Pages/
Shared/
_Layout.g.cshtml.cs
_ViewImports.g.cshtml.cs
_ViewStart.g.cshtml.cs
Index.g.cshtml.cs
Chcete-li zobrazit vygenerovanou třídu pro Pages/Index.cshtml , otevřete obj/Debug/netcoreapp2.1/Razor/Pages/Index.g.cshtml.cs .
Zobrazit hledání a rozlišovat velká a malá písmena
RazorModul zobrazení provádí pro zobrazení vyhledávání citlivá na velká a malá písmena. Skutečné vyhledávání je však určeno základním systémem souborů:
- Zdroj založený na souborech:
- v operačních systémech se systémy souborů bez rozlišení velkých a malých písmen (například Windows) se u hledání fyzického zprostředkovatele souborů nerozlišují velká a malá písmena. Výsledkem je například
return View("Test")shoda pro/Views/Home/Test.cshtml,/Views/home/test.cshtmla libovolné jiné varianty velikosti písmen. - V systémech souborů s rozlišováním velkých a malých písmen (například Linux, OSX a with
EmbeddedFileProvider) se při hledání rozlišují malá a velká písmena. Napříkladreturn View("Test")konkrétně odpovídá/Views/Home/Test.cshtml.
- v operačních systémech se systémy souborů bez rozlišení velkých a malých písmen (například Windows) se u hledání fyzického zprostředkovatele souborů nerozlišují velká a malá písmena. Výsledkem je například
- předkompilovaná zobrazení: u ASP.NET Core 2,0 a novějších, hledání předkompilovaných zobrazení rozlišuje velká a malá písmena ve všech operačních systémech. Chování je u Windows stejné jako chování poskytovatele fyzického souboru. Pokud se dvě Předkompilovaná zobrazení liší pouze v případě, výsledek hledání není deterministický.
Vývojářům doporučujeme, aby se shodovaly s velkými písmeny názvů souborů a adresářů na velká a malá písmena:
- Názvy oblastí, kontrolérů a akcí.
- Razor Stránky.
V případě, že se rozlišuje velká a malá písmena, zajistíte jejich zobrazení bez ohledu na základní systém souborů.
Importy používané Razor
následující importy jsou generovány ASP.NET Core webovými šablonami pro podporu Razor souborů:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
Další zdroje informací
úvod do ASP.NETho webového programování pomocí Razor Syntaxe poskytuje mnoho ukázek programování s Razor syntaxí.