天天看點

ASP.NET MVC 3和Razor中的@helper 文法

[原文發表位址]ASP.NET MVC 3 and the @helper syntax within Razor

[原文發表時間]Thursday, May 12, 2011 9:37 PM

ASP.NET MVC 3支援一項名為“Razor”的新視圖引擎選項(除了繼續支援/加強現有的.aspx視圖引擎外)。當編寫一個視圖模闆時,Razor将所需的字元和擊鍵數減少到最小,并保證一個快速、通暢的編碼工作流。

與大部分模闆的文法不同,在Razor的幫助下,您不需要中斷代碼編寫,僅僅為了在HTML中标注伺服器端代碼塊的開始和結束。代碼分析器足夠聰明,它能夠從你的代碼裡推斷出是否為伺服器端代碼。這種更加簡潔、富有表現力的文法更加幹淨,輸入也更快速,有趣。

您可以從過去9個月中我的相關博文來更多地了解Razor:

. Razor介紹

. Razor中的新 @model 關鍵字

. Razor布局

. Razor的伺服器端注釋

. Razor的@: 和 <text> 文法

. Razor的隐式和顯式代碼碎塊

. Razor的布局和闆塊

今天的博文涵蓋了Razor的一項很多人都不知道的功能——利用@helper文法定義可重用的幫助器方法。

簡單的 @helper 方法應用場景

Razor中的@helper文法讓您能夠輕松建立可重用的幫助器方法,此方法可以在您的視圖模闆中封裝輸出功能。他們使代碼能更好地重用,也使代碼更具有可讀性。讓我們看一個超級簡單的應用場景,它展示了@helper文法是怎樣被使用的。

在我們定義@helper方法之前的代碼

讓我們看一個簡單的産品清單應用場景。在此場景中,我們列出産品明細并輸出産品的價格或是單詞“免費!”——如果這個産品不花費任何成本的話:

以上代碼非常直截了當,而且Razor的文法使得在HTML裡能簡單地內建伺服器端C#代碼。

然而,一個有點混亂的地方是價格的if/else邏輯。我們可能在站點的其他位置輸出價格(或者在同一頁面上),而複制以上邏輯很容易出錯且難以維護。類似的應用場景是使用@helper文法提取和重構成為幫助器方法的首選考慮。

使用@helper文法重構以上樣例

讓我們提取價格輸出邏輯,并将其封裝在一個我們将命名為“DisplayPrice”的幫助器方法内。我們可以通過重寫以下代碼樣例來實作此操作:

ASP.NET MVC 3和Razor中的@helper 文法

我們已經使用上述@helper文法來定義名為“DisplayPrice”的可重用幫助器方法。就像标準C#/VB方法一樣,它可以包含任意數量的參數(您也可以定義參數為空或可選參數)。不過,與标準C#/VB方法不同的是,@helper方法可以同時包含内容和代碼并支援其中的完整Razor文法——這使得定義和封裝呈現/格式化幫助器方法變得非常簡單。

ASP.NET MVC 3和Razor中的@helper 文法

您可以像調用一個标準的C#或VB方法一樣,調用@helper方法:

ASP.NET MVC 3和Razor中的@helper 文法

當調用該方法時,Visual Studio會提供智能感覺代碼:

ASP.NET MVC 3和Razor中的@helper 文法
在多視圖模式中重用 @helper

在上面的執行個體中,我們在相同的視圖模闆中将@helper方法定義為調用它的代碼。或者,我們可以将@helper方法定義在視圖模闆外,并保證其在項目的所有視圖模闆中可重複使用。

您可以在.cshtml/.vbhtml儲存我們的@helper方法,并把這個檔案放在項目根目錄下建立的\App_Code目錄下例如,我在\App_Code檔案夾中建立了一個“ScottGu.cshtml”檔案,并且在檔案中定義了2個單獨的幫助器方法(在每個檔案中您可以有任意數量的幫助器方法):

ASP.NET MVC 3和Razor中的@helper 文法

一旦我們的幫助器定義在應用程式級别,我們就可以在應用程式的任何視圖模闆中使用它們。

在上面的\App_Code檔案夾中的ScottGu.cshtml會邏輯編譯為一個稱為“ScottGu”的類。這個類中包含了“DisplayPrice” 和 “AnotherHelper”的靜态成員。我們可以使用以下代碼重寫前面的示例來調用它:

ASP.NET MVC 3和Razor中的@helper 文法

當像如下方法調用應用程式級别幫助器時,Visual Studio将會提供智能感覺代碼:

ASP.NET MVC 3和Razor中的@helper 文法
5 15 日更新

:有一些人指出的一個問題是,當一個@helper儲存在\app_code目錄中時,預設情況下您不能通路其中的ASP.NET MVC Html幫助器方法。(例如Html.ActionLink(), Html.TextBox()等等)。而當它們定義在與視圖相同的檔案夾中,您是可以通路内置HTML幫助器方法的。當幫助器位于\app_code目錄下時,确實當下是不支援内置HTML幫助器方法的通路的——我們将在下次釋出中添加此功能。Paul Stovall有一個很好的幫助器類,您可以同時通路和使用它和您在\app_code目錄下定義的@helper方法中的内置Html方法。請從這裡了解更多關于如何使用的資訊。

總結

Razor的@helper文法提供了一種簡便的方法來将呈現功能封裝到幫助方法中去。您可以在單個視圖模闆或整個項目的所有視圖模闆中重用它。

您可以使用此功能來編寫更加幹淨、更易維護的代碼。

希望對您有所幫助。

繼續閱讀