2012-12-20 31 views
38

雖然在尋找一個主題,我從果園CMS庫下載,我注意到一個Layout.cshtml文件在文件的頂部有下面的代碼塊:剃鬚刀文件中的@functions代碼塊會做什麼,以及何時(如果曾經)應該使用它?

@functions { 
// To support the layout classifaction below. Implementing as a razor function because we can, could otherwise be a Func<string[], string, string> in the code block following. 
string CalcuClassify(string[] zoneNames, string classNamePrefix) 
{ 
    var zoneCounter = 0; 
    var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : ""; }).ToArray()); 
    return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : ""; 
} 
} 

我知道聲明的函數做什麼(計算哪些區域被填充以便返回每列的寬度),我的問題是:@function塊的正確用法是什麼,以及我應該何時使用它?

+0

個人而言,我認爲應該避免它,因爲它只是混淆了什麼是演示文稿/視圖層以及什麼是您的業務控制器/層。 – Liam

+12

@李安 - 我不同意。我認爲它應該明確地用於*避免*混濁的水域。在這個例子中,它是爲了確定列的寬度,這不是控制器應該知道的。 – Bobson

+1

@bobson指向 – Liam

回答

52

@functions塊允許您直接在視圖中定義效用函數,而不是將它們作爲擴展名添加到幫助器或讓控制器知道顯示屬性。你可以在滿足這些條件時使用它:

  1. 該功能與視圖緊密相關,並且在別處通常不會有用(例如「我的列有多寬」)。
  2. 該功能不僅僅是一個簡單的if語句,並且/或在視圖中的多個位置使用。
  3. 該視圖的Model中已存在該函數用於確定其邏輯的所有內容。

如果您第一個失敗,請將其添加爲@Html幫助程序。

如果你失敗了第二個,只是內聯。

如果第三個測試失敗,則應該在控制器中進行計算,並將結果作爲模型的一部分傳遞。

+0

+1。這是一個很好的答案。有一種情況使用'@ functions',但不是很常見! –

+1

很好的答案,特別是關於解釋你應該使用的備選方案的部分:D –

+0

好的答案,謝謝 –

0

msdn blogs@functions塊是讓你包裹起來可重用的代碼,如方法和屬性

0

在這種特殊情況下,誰創造了你正在使用可能是主題人試圖保持它作爲一個簡單的主題(只有視圖,CSS和圖像)。

如果您需要爲Orchard主題編寫一些代碼,則必須轉向模塊(如此處所述:http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme),除非您在視圖中編寫此代碼。

我不知道是否值得花時間從主題切換到模塊來獲取列的大小。

6

其他人已經解釋了什麼@functions這樣做,我不會重複這一點。但我想補充一點:

如果你的視圖被輸入到視圖模型,我認爲一個可行的選擇是將這個邏輯移動到視圖模型中,以避免使用太多的代碼混淆你的標記。否則,你的觀點開始越來越像傳統的ASP,我不認爲有人想要。

我認爲在您的視圖中使用@functions@helper沒有任何問題,但是一旦您在視圖中超出了一些方法,或者即使該函數有些複雜,也可能值得重構如果可能的話,視圖模型。如果它的代碼可以被重用,最好將它拉入到輔助類或HtmlHelper類的擴展中。有一件令人失望的事情是意識到你只是重寫了一段已經存在的代碼,因爲你不知道它隱藏在某些任意的視圖中。

相關問題