摘要:ASP.NET MVC 3: Razor的@:和語法
[原文發表位置] ASP.NET MVC 3: Razor』s @: and <text> syntax
[原文發表時間] Wednesday, December 15, 2010 11:48 PM
這是我正在寫的文章系列中的另一篇,涵蓋ASP.NET MVC 3的一些新功能:
- Razor的@:和<syntax>語法(今天)
本文將討論新版Razor裡繪製引擎中支援的兩個有用的語法功能:@:和<text>語法。
用Razor實現流暢程式設計
ASP.NET MVC 3配有一個新的名為「Razor」的繪製引擎選項(除了已有的.aspx繪製引擎)。您可以在我發表的介紹Razor的部落格上瞭解更多關於Razor的信息,比如我們為什麼要引進它,以及它所支援的語法。
Razor盡量減少編寫一個繪製模板需要敲入的字元數,實現快速流暢的程式設計工作流。與大部分模板的語法不同,你不必在HTML中為了明確地標記出伺服端語句塊的開始和結束而中斷程式設計。Razor解析器夠聰明,能從你的程式碼中推斷出來。這樣就使得語法簡潔明瞭,可以乾淨、快速和有趣地輸入。
例如下面的程式碼片段巡覽一列商品(product):
當執行時它產生的結果如下:
Razor 使用隱含分析技術分析一個程式碼區段什麼時候結束的一個方法是尋找代表內容塊開始的標記或元素內容。例如,在上面的程式碼段中Razor自動地把foreach迴圈裡面的<li></li>模組當作一個HTML內容區塊,因為它看到開始的<li>標記序列並且知道這在C#中是無效的。
這個獨特的技術——使用標記來識別程式碼中的內容區塊——是使Razor在涉及HTML生成的情況下簡潔高效的一個重要因素。
用@明確表示內容的起始
然而不是所有的內容塊都是以標記元素開始,在有些案例中,Razor解析器不能內隱的檢測出內容區塊。
這就需要Razor透過在程式碼塊中使用「@:字元序列」來顯式指明內容區塊的開始。@:序列表明該行後面的內容應該被視為內容區塊:
舉個更實際的例子。下面的程式碼段顯示在商品無庫存的時候,我們如何在商品名稱旁邊輸出訊息「(已售完!)」:
由於我沒有將訊息「已售完!」嵌入在HTML標籤元素內,Razor不能隱含判斷@if 區塊中的內容是否是一個內容區塊的開始。我們用「@:字元序列」來明確地指出我們程式碼區段裡的這行應被當作是內容區塊。
在@:內容塊中使用程式碼碎塊(Code Nugget)
除了輸出靜態內容,你也可以使程式碼碎塊嵌入以@:字元序列開始的內容區塊中。
例如,在下面的程式碼段中我們有兩個@:字元序列:
注意我們在第二個@:序列中如何發送內容區塊中的單品(Unit)數目的(例如「只剩下3了!」)。我們透過在內容行中嵌入一個@p.UnitsInStock程式碼碎塊來實現。
多行內容
Razor使在HTML元素中包裝多行內容變得簡單。例如,下面我們的@if容器中的內容塊被包裝在一個HTML<p>元素中,這會使得Razor把它當作內容:
對於在那些沒有被外部HTML元素包裝的多行內容情形,你可以使用多個@: 序列:
另外 ,Razor允許你用一個<text>元素 來明顯標示內容:
<text>標籤是一個 Razor 特殊處理的元素。Razor將<text>區塊的內部內容視為內容區塊,不呈現包含那些內容的<text>標籤(這意味著只呈現<text>內部內容,不呈現標籤本身)。這使呈現沒有被HTML元素包裝的多行內容區塊變得方便。
如果你喜歡<text>元素勝過更簡潔的@: 序列,<text>元素也能根據需要用來標示單行內容:
上面的程式碼將呈現出和我們早期看過的@:版本相同的輸出。Razor會自動地從輸出結果中省略掉<text>包裝部件,只是呈現出<text>裡面的內容。
總結
Razor啟用了一種簡潔的模板語法,實現非常流暢的寫碼工作流程。
Razor能靈活地透過檢測<tag>元素來識別內容塊的起始, 從而讓Razor方法在有HTML生成的場景中很有效,也使你在95% 左右的 if/else 和foreach 場景中,不用明顯地標注內容區塊的開始/結束.
在當你不想在一個程式碼容器區塊中使用HTML元素,卻需要更精確地標明一個內容塊的邊界時,你可以使用Razor的@:和<text>語法。
希望這些會有所幫助。
Scott
備註:除了發表部落格,我也在使用Twitter做快速更新和分享連結。請關注我:twitter.com/scottgu