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ù)制
<span>Hello World</span>
該 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>
}
else 和 else 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 方法以及:
-
Pet的 List<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/
- Admin/
- Pages/
- Shared/
- _Layout.cshtml
- _ViewImports.cshtml
- _ViewStart.cshtml
- Index.cshtml
- Index.cshtml.cs
- Shared/
在 Debug 配置下生成項(xiàng)目將生成以下 obj 目錄 :
- obj/
- Debug/
- netcoreapp2.1/
- Razor/
- Areas/
- Admin/
- Pages/
- Index.g.cshtml.cs
- Pages/
- Admin/
- Pages/
- Shared/
- _Layout.g.cshtml.cs
- _ViewImports.g.cshtml.cs
- _ViewStart.g.cshtml.cs
- Index.g.cshtml.cs
- Shared/
- Areas/
- Razor/
- netcoreapp2.1/
- Debug/
若要查看 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。
- 在使用不區(qū)分大小寫的文件系統(tǒng)的操作系統(tǒng)(例如,Windows)上,物理文件提供程序查找不區(qū)分大小寫。 例如,
- 預(yù)編譯視圖:在 ASP.NET Core 2.0 及更高版本中,預(yù)編譯視圖查找在所有操作系統(tǒng)上均不區(qū)分大小寫。 該行為與 Windows 上物理文件提供程序的行為相同。 如果兩個(gè)預(yù)編譯視圖僅大小寫不同,則查找的結(jié)果具有不確定性。
建議開發(fā)人員將文件和目錄名稱的大小寫與以下項(xiàng)的大小寫匹配:
- 區(qū)域、控制器和操作名稱。
- Razor 頁面。
匹配大小寫可確保無論使用哪種基礎(chǔ)文件系統(tǒng),部署都能找到其視圖。