ASP.NET Core 的 Razor 語法參考

Razor 是一種標(biāo)記語法,用于將基于服務(wù)器的代碼嵌入網(wǎng)頁中。 Razor 語法由 Razor 標(biāo)記、C# 和 HTML 組成。 包含 Razor 的文件通常具有 .cshtml 文件擴(kuò)展名。 在 Razor 組件文件 (.razor) 中也可以找到 Razor 。

呈現(xiàn) HTML

默認(rèn) Razor 語言為 HTML。 從 Razor 標(biāo)記呈現(xiàn) HTML 與從 HTML 文件呈現(xiàn) HTML 并沒有什么不同。 服務(wù)器會(huì)按原樣呈現(xiàn) .cshtml Razor 文件中的 HTML 標(biāo)記。

Razor 語法

Razor 支持 C#,并使用 @ 符號(hào)從 HTML 轉(zhuǎn)換為 C#。 Razor 計(jì)算 C# 表達(dá)式,并將它們呈現(xiàn)在 HTML 輸出中。

當(dāng) @ 符號(hào)后跟 Razor 保留關(guān)鍵字時(shí),它會(huì)轉(zhuǎn)換為 Razor 特定標(biāo)記。 否則會(huì)轉(zhuǎn)換為純 C#。

若要對(duì) Razor 標(biāo)記中的 @ 符號(hào)進(jìn)行轉(zhuǎn)義,請(qǐng)使用另一個(gè) @ 符號(hào):

CSHTML復(fù)制

<p>@@Username</p>

該代碼在 HTML 中使用單個(gè) @ 符號(hào)呈現(xiàn):

HTML復(fù)制

<p>@Username</p>

包含電子郵件地址的 HTML 屬性和內(nèi)容不將 @ 符號(hào)視為轉(zhuǎn)換字符。 Razor 分析不會(huì)處理以下示例中的電子郵件地址:

CSHTML復(fù)制

<a href="mailto:Support@contoso.com">Support@contoso.com</a>

隱式 Razor 表達(dá)式

隱式 Razor 表達(dá)式以 @ 開頭,后跟 C# 代碼:

CSHTML復(fù)制

<p>@DateTime.Now</p>
<p>@DateTime.IsLeapYear(2016)</p>

隱式表達(dá)式不能包含空格,但 C# await 關(guān)鍵字除外。 如果該 C# 語句具有明確的結(jié)束標(biāo)記,則可以混用空格:

CSHTML復(fù)制

<p>@await DoSomething("hello", "world")</p>

隱式表達(dá)式不能包含 C# 泛型,因?yàn)槔ㄌ?hào) (<>) 內(nèi)的字符會(huì)被解釋為 HTML 標(biāo)記。 以下代碼效:

CSHTML復(fù)制

<p>@GenericMethod<int>()</p>

上述代碼生成與以下錯(cuò)誤之一類似的編譯器錯(cuò)誤:

  • "int" 元素未結(jié)束。 所有元素都必須自結(jié)束或具有匹配的結(jié)束標(biāo)記。
  • 無法將方法組 "GenericMethod" 轉(zhuǎn)換為非委托類型 "object"。 是否希望調(diào)用此方法?`

泛型方法調(diào)用必須包裝在顯式 Razor 表達(dá)式Razor 代碼塊中。

顯式 Razor 表達(dá)式

顯式 Razor 表達(dá)式由 @ 符號(hào)和平衡圓括號(hào)組成。 若要呈現(xiàn)上一周的時(shí)間,可使用以下 Razor 標(biāo)記:

CSHTML復(fù)制

<p>Last week this time: @(DateTime.Now - TimeSpan.FromDays(7))</p>

將計(jì)算 @() 括號(hào)中的所有內(nèi)容,并將其呈現(xiàn)到輸出中。

前面部分中所述的隱式表達(dá)式通常不能包含空格。 在下面的代碼中,不會(huì)從當(dāng)前時(shí)間減去一周:

CSHTML復(fù)制

<p>Last week: @DateTime.Now - TimeSpan.FromDays(7)</p>

該代碼呈現(xiàn)以下 HTML:

HTML復(fù)制

<p>Last week: 7/7/2016 4:39:52 PM - TimeSpan.FromDays(7)</p>

可以使用顯式表達(dá)式將文本與表達(dá)式結(jié)果串聯(lián)起來:

CSHTML復(fù)制

@{
    var joe = new Person("Joe", 33);
}

<p>Age@(joe.Age)</p>

如果不使用顯式表達(dá)式,<p>Age@joe.Age</p> 會(huì)被視為電子郵件地址,因此會(huì)呈現(xiàn) <p>Age@joe.Age</p>。 如果編寫為顯式表達(dá)式,則呈現(xiàn) <p>Age33</p>

顯式表達(dá)式可用于從 .cshtml 文件中的泛型方法呈現(xiàn)輸出。 以下標(biāo)記顯示了如何更正之前出現(xiàn)的由 C# 泛型的括號(hào)引起的錯(cuò)誤。 此代碼以顯式表達(dá)式的形式編寫:

CSHTML復(fù)制

<p>@(GenericMethod<int>())</p>

表達(dá)式編碼

計(jì)算結(jié)果為字符串的 C# 表達(dá)式采用 HTML 編碼。 計(jì)算結(jié)果為 IHtmlContent 的 C# 表達(dá)式直接通過 IHtmlContent.WriteTo 呈現(xiàn)。 計(jì)算結(jié)果不為 IHtmlContent 的 C# 表達(dá)式通過 ToString 轉(zhuǎn)換為字符串,并在呈現(xiàn)前進(jìn)行編碼。

CSHTML復(fù)制

@("<span>Hello World</span>")

該代碼呈現(xiàn)以下 HTML:

HTML復(fù)制

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

該 HTML 在瀏覽器中顯示為:

復(fù)制

<span>Hello World</span>

HtmlHelper.Raw 輸出不進(jìn)行編碼,但呈現(xiàn)為 HTML 標(biāo)記。

警告

對(duì)未經(jīng)審查的用戶輸入使用 HtmlHelper.Raw 會(huì)帶來安全風(fēng)險(xiǎn)。 用戶輸入可能包含惡意的 JavaScript 或其他攻擊。審查用戶輸入比較困難。 應(yīng)避免對(duì)用戶輸入使用 HtmlHelper.Raw。

CSHTML復(fù)制

@Html.Raw("<span>Hello World</span>")

該代碼呈現(xiàn)以下 HTML:

HTML復(fù)制

<span>Hello World</span>

Razor 代碼塊

Razor 代碼塊以 @ 開頭,并括在 {} 中。 代碼塊內(nèi)的 C# 代碼不會(huì)呈現(xiàn),這點(diǎn)與表達(dá)式不同。 一個(gè)視圖中的代碼塊和表達(dá)式共享相同的作用域并按順序進(jìn)行定義:

CSHTML復(fù)制

@{
    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>

該代碼呈現(xiàn)以下 HTML:

HTML復(fù)制

<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>

隱式轉(zhuǎn)換

代碼塊中的默認(rèn)語言為 C#,不過,Razor 頁面可以轉(zhuǎn)換回 HTML:

CSHTML復(fù)制

@{
    var inCSharp = true;
    <p>Now in HTML, was in C# @inCSharp</p>
}

帶分隔符的顯式轉(zhuǎn)換

若要定義應(yīng)呈現(xiàn) HTML 的代碼塊子節(jié),請(qǐng)使用 Razor <text> 標(biāo)記將要呈現(xiàn)的字符括起來:

CSHTML復(fù)制

@for (var i = 0; i < people.Length; i++)
{
    var person = people[i];
    <text>Name: @person.Name</text>
}

使用此方法可呈現(xiàn)未被 HTML 標(biāo)記括起來的 HTML。 如果沒有 HTML 或 Razor 標(biāo)記,會(huì)發(fā)生 Razor 運(yùn)行時(shí)錯(cuò)誤。

<text> 標(biāo)記可用于在呈現(xiàn)內(nèi)容時(shí)控制空格:

  • 僅呈現(xiàn) <text> 標(biāo)記之間的內(nèi)容。
  • <text> 標(biāo)記之前或之后的空格不會(huì)顯示在 HTML 輸出中。

使用 @: 的顯式行轉(zhuǎn)換

若要在代碼塊內(nèi)以 HTML 的形式呈現(xiàn)整個(gè)行的其余內(nèi)容,請(qǐng)使用 @: 語法:

CSHTML復(fù)制

@for (var i = 0; i < people.Length; i++)
{
    var person = people[i];
    @:Name: @person.Name
}

如果代碼中沒有 @:,會(huì)生成 Razor 運(yùn)行時(shí)錯(cuò)誤。

Razor 文件中多余的 @ 字符可能會(huì)導(dǎo)致代碼塊中后面的語句發(fā)生編譯器錯(cuò)誤。 這些編譯器錯(cuò)誤可能難以理解,因?yàn)閷?shí)際錯(cuò)誤發(fā)生在報(bào)告的錯(cuò)誤之前。 將多個(gè)隱式/顯式表達(dá)式合并到單個(gè)代碼塊以后,經(jīng)常會(huì)發(fā)生此錯(cuò)誤。

控制結(jié)構(gòu)

控制結(jié)構(gòu)是對(duì)代碼塊的擴(kuò)展。 代碼塊的各個(gè)方面(轉(zhuǎn)換為標(biāo)記、內(nèi)聯(lián) C#)同樣適用于以下結(jié)構(gòu):

條件語句 @、else if、else 和 @switch

@if 控制何時(shí)運(yùn)行代碼:

CSHTML復(fù)制

@if (value % 2 == 0)
{
    <p>The value was even.</p>
}

elseelse if 不需要 @ 符號(hào):

CSHTML復(fù)制

@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>
}

以下標(biāo)記展示如何使用 switch 語句:

CSHTML復(fù)制

@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;
}

循環(huán)語句 @for、@foreach、@while 和 @dowhile

可以使用循環(huán)控制語句呈現(xiàn)模板化 HTML。 若要呈現(xiàn)一組人員:

CSHTML復(fù)制

@{
    var people = new Person[]
    {
          new Person("Weston", 33),
          new Person("Johnathon", 41),
          ...
    };
}

支持以下循環(huán)語句:

@for

CSHTML復(fù)制

@for (var i = 0; i < people.Length; i++)
{
    var person = people[i];
    <p>Name: @person.Name</p>
    <p>Age: @person.Age</p>
}

@foreach

CSHTML復(fù)制

@foreach (var person in people)
{
    <p>Name: @person.Name</p>
    <p>Age: @person.Age</p>
}

@while

CSHTML復(fù)制

@{ var i = 0; }
@while (i < people.Length)
{
    var person = people[i];
    <p>Name: @person.Name</p>
    <p>Age: @person.Age</p>

    i++;
}

@do while

CSHTML復(fù)制

@{ var i = 0; }
@do
{
    var person = people[i];
    <p>Name: @person.Name</p>
    <p>Age: @person.Age</p>

    i++;
} while (i < people.Length);

復(fù)合語句 @using

在 C# 中,using 語句用于確保釋放對(duì)象。 在 Razor 中,可使用相同的機(jī)制來創(chuàng)建包含附加內(nèi)容的 HTML 幫助程序。在下面的代碼中,HTML 幫助程序使用 @using 語句呈現(xiàn) <form> 標(biāo)記:

CSHTML復(fù)制

@using (Html.BeginForm())
{
    <div>
        Email: <input type="email" id="Email" value="">
        <button>Register</button>
    </div>
}

@try、catch、finally

異常處理與 C# 類似:

CSHTML復(fù)制

@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 可以使用 lock 語句來保護(hù)關(guān)鍵節(jié):

CSHTML復(fù)制

@lock (SomeLock)
{
    // Do critical section work
}

注釋

Razor 支持 C# 和 HTML 注釋:

CSHTML復(fù)制

@{
    /* C# comment */
    // Another C# comment
}
<!-- HTML comment -->

該代碼呈現(xiàn)以下 HTML:

HTML復(fù)制

<!-- HTML comment -->

在呈現(xiàn)網(wǎng)頁之前,服務(wù)器會(huì)刪除 Razor 注釋。 Razor 使用 @* *@ 來分隔注釋。 以下代碼已被注釋禁止,因此服務(wù)器不呈現(xiàn)任何標(biāo)記:

CSHTML復(fù)制

@*
    @{
        /* C# comment */
        // Another C# comment
    }
    <!-- HTML comment -->
*@

指令

Razor 指令由隱式表達(dá)式表示:@ 符號(hào)后跟保留關(guān)鍵字。 指令通常用于更改視圖分析方式或啟用不同的功能。

通過了解 Razor 如何為視圖生成代碼,更易理解指令的工作原理。

CSHTML復(fù)制

@{
    var quote = "Getting old ain't for wimps! - Anonymous";
}

<div>Quote of the Day: @quote</div>

該代碼生成與下面類似的類:

C#復(fù)制

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>");
    }
}

本文后面的檢查為視圖生成的 Razor C# 類部分說明了如何查看此生成的類。

@attribute

@attribute 指令將給定的屬性添加到生成的頁或視圖的類中。 以下示例添加 [Authorize] 屬性:

CSHTML復(fù)制

@attribute [Authorize]

@functions

@functions 指令允許將 C# 成員(字段、屬性和方法)添加到生成的類中:

CSHTML復(fù)制

@functions {
    // C# members (fields, properties, and methods)
}

例如:

CSHTML復(fù)制

@functions {
    public string GetHello()
    {
        return "Hello";
    }
}

<div>From method: @GetHello()</div> 

該代碼生成以下 HTML 標(biāo)記:

HTML復(fù)制

<div>From method: Hello</div>

以下代碼是生成的 Razor C# 類:

C#復(fù)制

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

@inherits

@inherits 指令對(duì)視圖繼承的類提供完全控制:

CSHTML復(fù)制

@inherits TypeNameOfClassToInheritFrom

下面的代碼是一種自定義 Razor 頁面類型:

C#復(fù)制

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.";
}

CustomText 顯示在視圖中:

CSHTML復(fù)制

@inherits CustomRazorPage<TModel>

<div>Custom text: @CustomText</div>

該代碼呈現(xiàn)以下 HTML:

HTML復(fù)制

<div>
    Custom text: Gardyloo! - A Scottish warning yelled from a window before dumping
    a slop bucket on the street below.
</div>

@model@inherits 可在同一視圖中使用。 @inherits 可位于視圖導(dǎo)入的 _ViewImports.cshtml 文件中:

CSHTML復(fù)制

@inherits CustomRazorPage<TModel>

下面的代碼是一種強(qiáng)類型視圖:

CSHTML復(fù)制

@inherits CustomRazorPage<TModel>

<div>The Login Email: @Model.Email</div>
<div>Custom text: @CustomText</div>

如果在模型中傳遞“rick@contoso.com”,視圖將生成以下 HTML 標(biāo)記:

HTML復(fù)制

<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

@inject 指令允許 Razor 頁面將服務(wù)從服務(wù)容器注入到視圖。 有關(guān)詳細(xì)信息,請(qǐng)參閱視圖中的依賴關(guān)系注入。

@model

此方案僅適用于 MVC 視圖和 Razor Pages (.cshtml)。

@model 指令指定傳遞到視圖或頁面的模型類型:

CSHTML復(fù)制

@model TypeNameOfModel

在使用個(gè)人用戶帳戶創(chuàng)建的 ASP.NET Core MVC 或 Razor Pages 應(yīng)用中,Views/Account/Login.cshtml 包含以下模型聲明:

CSHTML復(fù)制

@model LoginViewModel

生成的類繼承自 RazorPage<dynamic>

C#復(fù)制

public class _Views_Account_Login_cshtml : RazorPage<LoginViewModel>

Razor 公開了 Model 屬性,用于訪問傳遞到視圖的模型:

CSHTML復(fù)制

<div>The Login Email: @Model.Email</div>

@model 指令指定 Model 屬性的類型。 該指令將 RazorPage<T> 中的 T 指定為生成的類,視圖便派生自該類。 如果未指定 @model 指令,則 Model 屬性的類型為 dynamic。 有關(guān)詳細(xì)信息,請(qǐng)參閱強(qiáng)類型模型和 @model 關(guān)鍵字。

@namespace

@namespace 指令:

  • 設(shè)置生成的 Razor 頁面、MVC 視圖或 Razor 組件的類的命名空間。
  • 從目錄樹中最近的導(dǎo)入文件、_ViewImports.cshtml(視圖或頁面)或 _Imports.razor (Razor) 中設(shè)置頁面、視圖或組件類的根派生命名空間 。

CSHTML復(fù)制

@namespace Your.Namespace.Here

對(duì)于下表中顯示的 Razor Pages 示例:

  • 每個(gè)頁面都導(dǎo)入 Pages/_ViewImports.cshtml 。
  • Pages/_ViewImports.cshtml 包含 @namespace Hello.World
  • 每個(gè)頁面都有 Hello.World,作為其命名空間的根。
頁面 命名空間
Pages/Index.cshtml Hello.World
Pages/MorePages/Page.cshtml Hello.World.MorePages
Pages/MorePages/EvenMorePages/Page.cshtml Hello.World.MorePages.EvenMorePages

上述關(guān)系適用于與 MVC 視圖和 Razor 組件一起使用的導(dǎo)入文件。

當(dāng)多個(gè)導(dǎo)入文件具有 @namespace 指令時(shí),最靠近目錄樹中的頁面、視圖或組件的文件將用于設(shè)置根命名空間。

如果前面示例中的 EvenMorePages 文件夾具有包含 @namespace Another.Planet 的導(dǎo)入文件(或 Pages/MorePages/EvenMorePages/Page.cshtml 文件包含 @namespace Another.Planet),則結(jié)果如下表所示 。

頁面 命名空間
Pages/Index.cshtml Hello.World
Pages/MorePages/Page.cshtml Hello.World.MorePages
Pages/MorePages/EvenMorePages/Page.cshtml Another.Planet

@page

.cshtml 文件第一行上的 @page 指令表示該文件是 Razor Page 。 有關(guān)詳細(xì)信息,請(qǐng)參閱 ASP.NET Core 中的 Razor 頁面介紹。

@section

此方案僅適用于 MVC 視圖和 Razor Pages (.cshtml)。

@section 指令與 MVC 和 Razor Pages 布局結(jié)合使用,允許視圖或頁面將內(nèi)容呈現(xiàn)在 HTML 頁面的不同部分。 有關(guān)詳細(xì)信息,請(qǐng)參閱 ASP.NET Core 中的布局。

@using

@using 指令用于向生成的視圖添加 C# using 指令:

CSHTML復(fù)制

@using System.IO
@{
    var dir = Directory.GetCurrentDirectory();
}
<p>@dir</p>

模板化 Razor 委托

通過 Razor 模板,可使用以下格式定義 UI 代碼片段:

CSHTML復(fù)制

@<tag>...</tag>

下面的示例演示如何指定模板化 Razor 委托作為 Func<T,TResult>。 為委托封裝的方法的參數(shù)指定動(dòng)態(tài)類型。 將對(duì)象類型指定為委托的返回值。 該模板與 Pet(具有 Name 屬性)的 List<T> 一起使用。

C#復(fù)制

public class Pet
{
    public string Name { get; set; }
}

CSHTML復(fù)制

@{
    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" }
    };
}

使用 foreach 語句提供的 pets 呈現(xiàn)該模板:

CSHTML復(fù)制

@foreach (var pet in pets)
{
    @petTemplate(pet)
}

呈現(xiàn)的輸出:

HTML復(fù)制

<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>

還可以提供內(nèi)聯(lián) Razor 模板作為方法的參數(shù)。 如下示例中,Repeat 方法收到一個(gè) Razor 模板。 該方法使用模板生成 HTML 內(nèi)容,其中包含列表中提供的重復(fù)項(xiàng):

CSHTML復(fù)制

@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;
    }
}

使用前面示例中的 pets 列表,調(diào)用 Repeat 方法以及:

  • PetList<T>
  • 每只寵物的重復(fù)次數(shù)。
  • 用于無序列表的列表項(xiàng)的內(nèi)聯(lián)模板。

CSHTML復(fù)制

<ul>
    @Repeat(pets, 3, @<li>@item.Name</li>)
</ul>

呈現(xiàn)的輸出:

HTML復(fù)制

<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>

標(biāo)記幫助程序

此方案僅適用于 MVC 視圖和 Razor Pages (.cshtml)。

標(biāo)記幫助程序有三個(gè)相關(guān)指令。

指令 函數(shù)
@addTagHelper 向視圖提供標(biāo)記幫助程序。
@removeTagHelper 從視圖中刪除以前添加的標(biāo)記幫助程序。
@tagHelperPrefix 指定標(biāo)記前綴,以啟用標(biāo)記幫助程序支持并闡明標(biāo)記幫助程序的用法。

Razor 保留關(guān)鍵字

Razor 關(guān)鍵字

  • page(需要 ASP.NET Core 2.1 或更高版本)
  • namespace
  • functions
  • inherits
  • model
  • section
  • helper(ASP.NET Core 當(dāng)前不支持)

Razor 關(guān)鍵字使用 @(Razor Keyword) 進(jìn)行轉(zhuǎn)義(例如,@(functions))。

C# Razor 關(guān)鍵字

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

C# Razor 關(guān)鍵字必須使用 @(@C# Razor Keyword) 進(jìn)行雙轉(zhuǎn)義(例如,@(@case))。 第一個(gè) @ 對(duì) Razor 分析器轉(zhuǎn)義。第二個(gè) @ 對(duì) C# 分析器轉(zhuǎn)義。

Razor 不使用的保留關(guān)鍵字

  • class

檢查為視圖生成的 Razor C# 類

在 .NET Core SDK 2.1 或更高版本中,Razor SDK 負(fù)責(zé)編譯 Razor 文件。 生成項(xiàng)目時(shí),Razor SDK 在項(xiàng)目根目錄中生成 obj/<build_configuration>/<target_framework_moniker>/Razor 目錄 。 Razor 目錄中的目錄結(jié)構(gòu)反映項(xiàng)目的目錄結(jié)構(gòu) 。

在面向 .NET Core 2.1 的 ASP.NET Core 2.1 Razor Pages 項(xiàng)目中,請(qǐng)考慮以下目錄結(jié)構(gòu):

  • Areas/
    • Admin/
      • Pages/
        • Index.cshtml
        • Index.cshtml.cs
  • Pages/
    • Shared/
      • _Layout.cshtml
    • _ViewImports.cshtml
    • _ViewStart.cshtml
    • Index.cshtml
    • Index.cshtml.cs

在 Debug 配置下生成項(xiàng)目將生成以下 obj 目錄 :

  • 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

若要查看 Pages/Index.cshtml 的生成類,請(qǐng)打開 obj/Debug/netcoreapp2.1/Razor/Pages/Index.g.cshtml.cs 。

視圖查找和區(qū)分大小寫

Razor 視圖引擎為視圖執(zhí)行區(qū)分大小寫的查找。 但是,實(shí)際查找取決于基礎(chǔ)文件系統(tǒng):

  • 基于文件的源:
    • 在使用不區(qū)分大小寫的文件系統(tǒng)的操作系統(tǒng)(例如,Windows)上,物理文件提供程序查找不區(qū)分大小寫。 例如,return View("Test") 可匹配 /Views/Home/Test.cshtml、 /Views/home/test.cshtml 以及任何其他大小寫變體。
    • 在區(qū)分大小寫的文件系統(tǒng)(例如,Linux、OSX 以及使用 EmbeddedFileProvider 構(gòu)建的文件系統(tǒng))上,查找區(qū)分大小寫。 例如,return View("Test") 專門匹配 /Views/Home/Test.cshtml。
  • 預(yù)編譯視圖:在 ASP.NET Core 2.0 及更高版本中,預(yù)編譯視圖查找在所有操作系統(tǒng)上均不區(qū)分大小寫。 該行為與 Windows 上物理文件提供程序的行為相同。 如果兩個(gè)預(yù)編譯視圖僅大小寫不同,則查找的結(jié)果具有不確定性。

建議開發(fā)人員將文件和目錄名稱的大小寫與以下項(xiàng)的大小寫匹配:

  • 區(qū)域、控制器和操作名稱。
  • Razor 頁面。

匹配大小寫可確保無論使用哪種基礎(chǔ)文件系統(tǒng),部署都能找到其視圖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容