|
ASP.NET MVC 3支持一項(xiàng)名為“Razor”的新視圖引擎選項(xiàng)(除了繼續(xù)支持/加強(qiáng)現(xiàn)有的.ASPx視圖引擎外)。當(dāng)編寫一個(gè)視圖模板時(shí),Razor將所需的字符和擊鍵數(shù)減少到最小,并保證一個(gè)快速、通暢的編碼工作流。
與大部分模板的語(yǔ)法不同,在Razor的幫助下,您不需要中斷代碼編寫,僅僅為了在HTML中標(biāo)注服務(wù)器端代碼塊的開始和結(jié)束。代碼分析器足夠聰明,它能夠從你的代碼里推斷出是否為服務(wù)器端代碼。這種更加簡(jiǎn)潔、富有表現(xiàn)力的語(yǔ)法更加干凈,輸入也更快速,有趣。
今天的博文涵蓋了Razor的一項(xiàng)很多人都不知道的功能——利用@helper語(yǔ)法定義可重用的幫助器方法。
簡(jiǎn)單的 @helper 方法應(yīng)用場(chǎng)景
Razor中的@helper語(yǔ)法讓您能夠輕松創(chuàng)建可重用的幫助器方法,此方法可以在您的視圖模板中封裝輸出功能。他們使代碼能更好地重用,也使代碼更具有可讀性。讓我們看一個(gè)超級(jí)簡(jiǎn)單的應(yīng)用場(chǎng)景,它展示了@helper語(yǔ)法是怎樣被使用的。
在我們定義@helper方法之前的代碼
讓我們看一個(gè)簡(jiǎn)單的產(chǎn)品列表應(yīng)用場(chǎng)景。在此場(chǎng)景中,我們列出產(chǎn)品明細(xì)并輸出產(chǎn)品的價(jià)格或是單詞“免費(fèi)!”——如果這個(gè)產(chǎn)品不花費(fèi)任何成本的話:
以上代碼非常直截了當(dāng),而且Razor的語(yǔ)法使得在HTML里能簡(jiǎn)單地集成服務(wù)器端C#代碼。
然而,一個(gè)有點(diǎn)混亂的地方是價(jià)格的if/else邏輯。我們可能在站點(diǎn)的其他位置輸出價(jià)格(或者在同一頁(yè)面上),而復(fù)制以上邏輯很容易出錯(cuò)且難以維護(hù)。類似的應(yīng)用場(chǎng)景是使用@helper語(yǔ)法提取和重構(gòu)成為幫助器方法的首選考慮。
使用@helper語(yǔ)法重構(gòu)以上樣例
讓我們提取價(jià)格輸出邏輯,并將其封裝在一個(gè)我們將命名為“DisplayPrice”的幫助器方法內(nèi)。我們可以通過(guò)重寫以下代碼樣例來(lái)實(shí)現(xiàn)此操作:
我們已經(jīng)使用上述@helper語(yǔ)法來(lái)定義名為“DisplayPrice”的可重用幫助器方法。就像標(biāo)準(zhǔn)C#/VB方法一樣,它可以包含任意數(shù)量的參數(shù)(您也可以定義參數(shù)為空或可選參數(shù))。不過(guò),與標(biāo)準(zhǔn)C#/VB方法不同的是,@helper方法可以同時(shí)包含內(nèi)容和代碼并支持其中的完整Razor語(yǔ)法——這使得定義和封裝呈現(xiàn)/格式化幫助器方法變得非常簡(jiǎn)單。
您可以像調(diào)用一個(gè)標(biāo)準(zhǔn)的C#或VB方法一樣,調(diào)用@helper方法:
當(dāng)調(diào)用該方法時(shí),Visual Studio會(huì)提供智能感知代碼:
在多視圖模式中重用@helper
在上面的實(shí)例中,我們?cè)谙嗤囊晥D模板中將@helper方法定義為調(diào)用它的代碼。或者,我們可以將@helper方法定義在視圖模板外,并保證其在項(xiàng)目的所有視圖模板中可重復(fù)使用。
您可以在.cshtml/.vbhtml保存我們的@helper方法,并把這個(gè)文件放在項(xiàng)目根目錄下創(chuàng)建的/App_Code目錄下例如,我在/App_Code文件夾中創(chuàng)建了一個(gè)“ScottGu.cshtml”文件,并且在文件中定義了2個(gè)單獨(dú)的幫助器方法(在每個(gè)文件中您可以有任意數(shù)量的幫助器方法):
一旦我們的幫助器定義在應(yīng)用程序級(jí)別,我們就可以在應(yīng)用程序的任何視圖模板中使用它們。
在上面的/App_Code文件夾中的ScottGu.cshtml會(huì)邏輯編譯為一個(gè)稱為“ScottGu”的類。這個(gè)類中包含了“DisplayPrice” 和 “AnotherHelper”的靜態(tài)成員。我們可以使用以下代碼重寫前面的示例來(lái)調(diào)用它:
當(dāng)像如下方法調(diào)用應(yīng)用程序級(jí)別幫助器時(shí),Visual Studio將會(huì)提供智能感知代碼:
5月15日更新:有一些人指出的一個(gè)問(wèn)題是,當(dāng)一個(gè)@helper保存在/app_code目錄中時(shí),默認(rèn)情況下您不能訪問(wèn)其中的ASP.NET MVC Html幫助器方法。(例如Html.ActionLink(), Html.TextBox()等等)。而當(dāng)它們定義在與視圖相同的文件夾中,您是可以訪問(wèn)內(nèi)置HTML幫助器方法的。當(dāng)幫助器位于/app_code目錄下時(shí),確實(shí)當(dāng)下是不支持內(nèi)置HTML幫助器方法的訪問(wèn)的——我們將在下次發(fā)布中添加此功能。Paul Stovall有一個(gè)很好的幫助器類,您可以同時(shí)訪問(wèn)和使用它和您在/app_code目錄下定義的@helper方法中的內(nèi)置Html方法。請(qǐng)從這里了解更多關(guān)于如何使用的信息。
總結(jié)
Razor的@helper語(yǔ)法提供了一種簡(jiǎn)便的方法來(lái)將呈現(xiàn)功能封裝到幫助方法中去。您可以在單個(gè)視圖模板或整個(gè)項(xiàng)目的所有視圖模板中重用它。
您可以使用此功能來(lái)編寫更加干凈、更易維護(hù)的代碼。
NET技術(shù):ASP.NET MVC 3和Razor中的@helper 語(yǔ)法,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。