Asp.net MVC]Asp.net MVC5系列——Razor語法


目錄

概念

Razor語法

總結

系列文章

[Asp.net MVC]Asp.net MVC5系列——第一個項目

[Asp.net MVC]Asp.net MVC5系列——添加視圖

[Asp.net MVC]Asp.net MVC5系列——添加模型

[Asp.net MVC]Asp.net MVC5系列——從控制器訪問模型中的數據

[Asp.net MVC]Asp.net MVC5系列——添加數據

[Asp.net MVC]Asp.net MVC5系列——在模型中添加驗證規則 

[Asp.net MVC]Asp.net MVC5系列——實現編輯、刪除與明細信息視圖

概念

Razor視圖引擎是Asp.net MVC3中新擴展的內容,並且也是它的默認視圖引擎。還有另外一種Web Forms視圖引擎。通過前面的文章可知在Asp.net mvc5中創建視圖,默認使用的是Razor視圖引擎。而且真正的就一種了。記得之前版本的,還可以讓開發者選擇是使用Razor還是webfroms視圖引擎。

Razor為視圖表示提供了一種精簡的語法,最大限度的減少了語法和額外的字符。這樣就有效的減少了語法障礙,並且在視圖標記語言中也沒有新的語法規則。

Razor支持兩種文件類型,分別是.cshtml 和.vbhtml,其中.cshtml 的服務器代碼使用了c#的語法,.vbhtml 的服務器代碼使用了vb.net的語法。

Razor語法

Razor的核心轉換字符是“at”符號(@)。

該字符作用

用作標記-代碼的轉換字符。

代碼-標記的轉換字符。

有兩種基本類型的轉換:代碼表達式和代碼塊。求出表達式的值,然后將值寫入到響應中。

代碼表達式

隱式代碼表達式

示例:

1         @{string strName = "wofly";}
2         <h1> Length of the boy's name is  @strName.Length chars.</h1>

 

結果

Razor十分智能,可以知道表達式后面的空格字符不是一個有效的標識符,所以可以順暢地回到標記語言。

顯示代碼表達式

Razor自動從代碼轉會標記的能力有時也會帶來二義性,例如下面的Razor片段:

1         @{string rootNameSpace = "MyApp";}
2         <span>@rootNameSpace.Models</span>

想要輸出的結果是:

<span>MyApp.Models</span>

編譯時出錯,提示string沒有Models屬性。在這種情況下,Razor不能理解我們想要干啥,而會認為@rootNameSpace是代碼表達式。那么該怎么解決呢?Razor可以通過將表達式用圓括號括起來顯示代碼表達式:

 <span>@(rootNameSpace).Models</span>

 

這樣就告知Razor,.Models是字面量文本,而不是表達式的一部分。
@符號如何跟郵箱中的@區別呢?

例如:

 <span>wolfy@163.com</span>

 

你會發現,形如上面的代碼並沒有報錯,Razor是如何做到呢?

Razor采用了一個簡單的算法來判別看起來像郵箱地址的字符串到底是不是一個有效的郵箱地址。雖然它並不完美,但卻可以適用於大多數情況。在一些特殊情況下,有效的郵箱地址可能會顯示不出來,這是可以用兩個@@符號轉義一個@符號。

如果,我們想要這樣的字符串作為一個表達式,該怎么辦?

假如,我們有這樣的一個列表項:

<li>item_@item.Length</li>

 

這種特殊情況下,這個表達式會被解析為一個郵箱地址,所以Razor將其逐字打印。但我們想要的結果是:

<li>item_3</li>

 

所以遇到這種情況,我們仍可以使用圓括號指明想要的內容。

<li>item_@(item.Length)</li>

 

如果想輸出@開頭的字符,可以使用@@轉義@字符。

 HTML編碼

在很多情況下需要用視圖顯示用戶的輸入,例如一些網站的評論功能。所以總是存在潛在的跨站腳本注入攻擊(XSS)。這些,Razor也替我們想到了,Razor表達式是用HTML自動編碼的。

1         @{string strAlert = "<script>alert('警告');</script>";}
2         <span>@strAlert</span>
1         @{string strAlert = "<script>alert('警告');</script>";}
2         <span>@strAlert</span>

 

查看生成的html,你會發現對標簽進行了html編碼:

<span>&lt;script&gt;alert(&#39;警告&#39;);&lt;/script&gt;</span>

 

頁面顯示

無編碼代碼表達式

如果我們確實想讓瀏覽器解析成html標簽,就需要返回一個System.Web.IHtmlString對象的實例,這種情況下Razor並不對它進行編碼。例如html輔助類。同樣我們可以使用Html.Raw方法。

1         @{string strAlert = "<script>alert('警告');</script>";}
2         <span>@Html.Raw(strAlert)</span>

 

此時瀏覽該視圖,就會出現彈出框。
另外需要注意,當在js中將用戶提供的值賦給變量時,要使用js字符串編碼而不僅僅是html編碼。也就是要是用@Ajax.JavaScriptStringEncode方法對用戶輸入進行編碼。

代碼塊

代碼塊是簡單的執行代碼部分。

例如

1         @{
2             int x = 123;
3             string y = "wofly";
4         }

 

上面代碼塊定義變量int類型的x和字符串類型y,如果想輸出它們,則可以使用@x和@y。

文本和標簽混合使用

1         @foreach (var item in models) {
2         <span>@item.Name</span>
3         }

 

 混合代碼和純本文

1 @if (true)
2 {
3     <text>這是文本</text>
4 }

服務器端的注釋可以使用@**@對不想要的代碼進行注釋。

@*@if (true)
{
    <text>這是文本</text>
}*@

調用泛型方法

1  @(Html.SomeMethod<T>())

 

總結

 這里簡單的介紹了Razor的兩種基本類型:代碼表達式和代碼塊。語法沒有想的那么難。關鍵在於@字符。

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM