隨著技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。 經過前幾篇文章... ...
隨著技術的發展,ASP.NET Core MVC也推出了好長時間,經過不斷的版本更新迭代,已經越來越完善,本系列文章主要講解ASP.NET Core MVC開發B/S系統過程中所涉及到的相關內容,適用於初學者,在校畢業生,或其他想從事ASP.NET Core MVC 系統開發的人員。 經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據,路由,頁面佈局,wwwroot和客戶端庫等內容,今天繼續講解ASP.NET Core MVC 中Razor語法等相關內容,僅供學習分享使用。
Razor視圖
在ASP.NET Core MVC項目中,預設創建的視圖,都是以cshtml為尾碼的Razor視圖。
基於 Razor 的視圖模板:
- 具有
.cshtml
文件擴展名。 - 提供一種巧妙的方法來使用 C# 創建 HTML 輸出。
添加Razor視圖
在項目中添加視圖,可以通過在控制器中的Action上右鍵進行添加對應視圖,也可以通過在Views中創建目錄,然後目錄上右鍵添加視圖,如下所示:
打開添加視圖對話框,選擇Razor視圖,點擊【添加】按鈕,如下所示:
輸入視圖名稱,如Index,點擊【添加】按鈕,模板可根據具體需要是否添加,如下所示:
經過以上步驟後,即可添加視圖成功,如下所示:
預設視圖效果如下所示:
Razor介紹
Razor 是一種標記語法,用於將基於 .NET 的代碼嵌入網頁中。 Razor 語法由 Razor 標記、C# 和 HTML 組成。 包含 Razor 的文件通常具有 .cshtml
文件擴展名。 從 Razor 標記呈現 HTML 與從 HTML 文件呈現 HTML 沒有什麼不同。
Razor語法
Razor 支持 C#,並使用 @
符號從 HTML 轉換為 C#。 Razor 計算 C# 表達式,並將它們呈現在 HTML 輸出中。當符號 @
後跟 Razor 保留關鍵字時,它將轉換為 Razor特定於 的標記。 否則會轉換為純 HTML。不過凡事總有特例,如包含在email中的@符號將不會被當成轉換字元,而是直接顯示。
1 <a href="mailto:[email protected]">[email protected]</a>
隱式Razor表達式
隱式 Razor 表達式以 @
開頭,後跟 C# 代碼。
1 <p>今天是:@DateTime.Now</p> 2 <p>昨天是:@DateTime.Now.AddDays(-1)</p>
隱式表達式不能包含空格,但 C# await
關鍵字除外。 如果該 C# 語句具有明確的結束標記,則可以混用空格:
1 @{ 2 ViewData["Title"] = "Index"; 3 4 async Task<string> DoSomething(string left,string right) 5 { 6 return left + right; 7 8 } 9 } 10 11 12 <h1>Index</h1> 13 <p>@await DoSomething("hello", "world")</p>
隱式表達式不能包含 C# 泛型,因為括弧 (<>
) 內的字元會被解釋為 HTML 標記。 以下代碼無效:
1 @{ 2 ViewData["Title"] = "Index"; 3 4 string? GenericMethod<T>(T t) 5 { 6 return t?.ToString(); 7 } 8 } 9 10 11 <h1>Index</h1> 12 <!--不能使用泛型--> 13 <p>@GenericMethod<int>(0)</p>
註意:泛型方法調用必須包裝在 顯式 Razor 表達式 或 Razor 代碼塊中。
顯式Razor表達式
顯式 Razor 表達式由 @
符號和一對小括弧組成,將計算 @()
括弧中的所有內容,並將其呈現到輸出中。 若要進行一些計算,可使用以下 Razor 標記:
1 @{ 2 ViewData["Title"] = "Index"; 3 4 int a=1,b=2,c=3,d=4; 5 } 6 7 8 <h1>Index</h1> 9 <!--顯式Razor表達式--> 10 <p>@(a+b+c+d)</p> 11 <!--隱式Razor表達式--> 12 <p>@a+b+c+d</p>
在上述例子中,顯示Razor表達式和隱式Razor表達式在頁面顯示的效果是不同的,如下所示:
另外在隱式Razor表達式中,不支持泛型,在顯示Razor表達式中是支持泛型的。如下所示:
1 <p>@(GenericMethod<int>(10))</p>
表達式編碼
通過Razor表達式進行輸出時,有時並不能達到想要效果,如下所示:
1 <!--輸出原生標簽併進行轉義--> 2 <div>@("<span>Hello World</span>")</div> 3 <!--輸入標簽中的內容--> 4 <div>@Html.Raw("<span>Hello World</span>")</div>
在頁面上輸出結果如下所示:
Razor代碼塊
Razor 代碼塊以 @
開始,並括在 {}
中。 代碼塊內的 C# 代碼不會呈現,這點與表達式不同。 一個視圖中的代碼塊和表達式共用相同的作用域並按順序進行定義:
1 @{ 2 var quote = "我是公子小六"; 3 } 4 5 <p>@quote</p> 6 7 @{ 8 quote = "小六公子是我"; 9 } 10 11 <p>@quote</p>
在頁面輸出 如下所示:
隱式轉換
代碼塊中的預設語言是 C#,但 Razor 頁面可以轉換回 HTML:
1 @{ 2 var name = "我是公子小六"; 3 <p>Now in HTML, was in C# @name</p> 4 }
顯式行轉換
要在代碼塊內以 HTML 形式呈現整個行的其餘內容,請使用 @:
語法:
1 @for (var i = 0; i < students.Length; i++) 2 { 3 var student = students[i]; 4 @:student: @student.Name 5 }
如果代碼中沒有 @:
,會生成 Razor 運行時錯誤。
Razor 文件中多餘的 @
字元可能會導致代碼塊中後面的語句發生編譯器錯誤。 這些額外的 @
編譯器錯誤:
- 可能難以理解,因為實際錯誤發生在報告的錯誤之前。
- 在將多個隱式表達式和顯式表達式合併到單個代碼塊後很常見。
控制結構
控制結構是對代碼塊的擴展。 代碼塊的各個方面(轉換為標記、內聯 C#)同樣適用於以下結構:
條件控制語句
條件 @if, else if, else,如下所示:
1 @{ 2 int value = 10; 3 } 4 5 @if (value % 2 == 0) 6 { 7 <p>The value was even.</p> 8 } 9 else if (value >= 1337) 10 { 11 <p>The value is large.</p> 12 } 13 else 14 { 15 <p>The value is odd and small.</p> 16 }
以下標記展示如何使用 switch 語句:
1 @switch (value) 2 { 3 case 1: 4 <p>The value is 1!</p> 5 break; 6 case 1337: 7 <p>Your number is 1337!</p> 8 break; 9 default: 10 <p>Your number wasn't 1 or 1337.</p> 11 break; 12 }
迴圈控制
迴圈 @for, @foreach, @while, and @do while
@for迴圈
1 @{ 2 var students = new Student[] 3 { 4 new Student(){Id=1,Name="公"}, 5 new Student(){Id=2,Name="子"}, 6 new Student(){Id=3,Name="小"}, 7 new Student(){Id=4,Name="六"}, 8 }; 9 } 10 @for (var i = 0; i < students.Length; i++) 11 { 12 var student = students[i]; 13 <div> 14 <span>Id: @student.Id</span> 15 <span>Name: @student.Name</span> 16 </div> 17 }
@foreach迴圈
1 @foreach (var student in students) 2 { 3 <div> 4 <span>Id: @student.Id</span> 5 <span>Name: @student.Name</span> 6 </div> 7 }
@while迴圈
1 @{ var i = 0; } 2 @while (i < students.Length) 3 { 4 var student = students[i]; 5 <div> 6 <span>Id: @student.Id</span> 7 <span>Name: @student.Name</span> 8 </div> 9 i++; 10 }
@do while迴圈
1 @{ var i = 0; } 2 @do 3 { 4 var student = students[i]; 5 <div> 6 <span>Id: @student.Id</span> 7 <span>Name: @student.Name</span> 8 </div> 9 10 i++; 11 } while (i < students.Length);
以上4種迴圈方式實現的效果都是一樣的,如下所示:
異常捕獲
@try, catch, finally,異常處理與 C# 類似:
1 @try 2 { 3 throw new InvalidOperationException("無效操作."); 4 } 5 catch (Exception ex) 6 { 7 <p>異常信息: @ex.Message</p> 8 } 9 finally 10 { 11 <p>finally塊.</p> 12 }
在頁面上輸出如下內容:
Razor註釋
Razor 支持 C# 和 HTML 註釋:
1 @{ 2 /* C# comment */ 3 // Another C# comment 4 } 5 <!-- HTML comment --> 6 @* 7 @{ 8 /* C# comment */ 9 // Another C# comment 10 } 11 <!-- HTML comment --> 12 *@
在呈現網頁之前,伺服器會刪除 Razor 註釋。 Razor 使用 @* *@
來分隔註釋。 以上代碼第3段已被註釋禁止,因此伺服器不呈現任何標記。
Razor保留關鍵字
Razor 關鍵字
page
namespace
functions
inherits
model
section
helper
(ASP.NET Core 當前不支持)
Razor 關鍵字使用 @(Razor Keyword)
進行轉義(例如,@(functions)
)。
C# Razor 關鍵字
case
do
default
for
foreach
if
else
lock
switch
try
catch
finally
using
while
C# Razor 關鍵字必須使用 @(@C# Razor Keyword)
進行雙轉義(例如,@(@case)
)。 第一個 @
對 Razor 分析程式轉義。 第二個 @
對 C# 分析器轉義。
Razor 未使用的保留關鍵字
class
以上就是ASP.NET Core MVC 從入門到精通之Razor語法簡介的主要內容,關於其他Razor語法內容,可參考文檔:
參考文檔:https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/razor?view=aspnetcore-7.0
作者:小六公子
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章