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:

&lt;span&gt;Hello World&lt;/span&gt;

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.cshtml strá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.cshtml obsahuje @namespace Hello.World .
  • Každá stránka má Hello.World jako 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 :

@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 RenderFragment rámci parametru. Například podřízený obsah předaný jiné komponentě.
  • Předchází nebo následuje blok kódu jazyka C#, například @if nebo @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ší)
  • namespace
  • functions
  • inherits
  • model
  • section
  • helper(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#

  • case
  • do
  • default
  • for
  • foreach
  • if
  • else
  • lock
  • switch
  • try
  • catch
  • finally
  • using
  • while

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.cshtml a 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říklad return View("Test") konkrétně odpovídá /Views/Home/Test.cshtml .
  • 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í.