2011-06-14 142 views
28

我有一個由多個頁面共享在我看來功能:共享MVC剃刀功能

@functions 
{ 
    public HtmlString ModeImage(ModeEnum mode) 
    { 
     switch(mode) 
     { 
      case AMode: new HtmlString("<img etc..."); break; 
      // more etc... 
     } 
    } 
} 

有沒有辦法把它在一個單獨的文件,包括它的每一頁上,而不必複製並粘貼到每一個。我知道我可以編寫一個.cs文件並在每個頁面上訪問它,但是這個函數真的關心這個視圖,而且如果這個函數改變了,我不想重新編譯。

+2

重新編譯有什麼問題? – SLaks 2011-06-14 17:27:08

+0

把這個功能放進佈局視圖 – 2011-06-14 17:34:42

+2

@Miro:那不行。頁面不會從佈局頁面繼承任何內容。畢竟,佈局是在運行時設置的。 – SLaks 2011-06-14 17:49:33

回答

20

這聽起來像你想要Scott Guthrie在博客文章ASP.NET MVC3 and the @helper syntax within Razor中描述的Razor @helper方法。

這裏是概述... 「內剃刀@helper語法使您可以輕鬆創建可重用的helper方法可以在視圖模板,它們能夠更好地重用代碼封裝輸出功能,並且還可以方便更可讀的代碼「。

+0

它看起來並不像他想要的幫手(他將無效) – SLaks 2011-06-14 17:31:54

+0

@SLaks感謝您指出......以前錯過了它。 – 2011-06-14 17:39:22

+0

對不起,它是一種幫助器方法,它返回一個圖像html取決於枚舉。我覺得它太少了,我不想重新編譯代碼,如果我說,更改圖標的名稱。這看起來像我在找什麼。首先嚐試一下。 – kailoon 2011-06-14 18:16:00

4

您可以製作一個static helper page並在頁面中放置正常的static方法。
然後,您可以通過在任何地方編寫PageName.MyMethod()來調用它,並且我相信您不需要重新編譯該項目。

31

(這裏是現有回答的更詳細的版本。)

創建的MVC項目的根稱爲App_Code文件夾,如果它不存在。在這裏,創建一個空的Razor視圖,並命名爲任何你想要的:

MVC project with Razor view called Shared.cshtml inside App_Code folder

添加@helper S和/或static方法,它需要:

@helper ShowSomething() 
{ 
    <span>Something</span> 
} 

@functions 
{ 
    public static int CalculateSomething() 
    { 
     return 1; 
    } 
} 

然後從您的視圖使用它們通過首先訪問按名稱共享的視圖:

@Shared.ShowSomething() 
@Shared.CalculateSomething() 
+0

太棒了。你能爲一個區域做同樣的事嗎?基本上,不是在整個代碼庫中共享,而只是一個部分? – twsmale 2016-09-29 17:03:11

+0

@twsmale,我不知道;我以前沒有真正使用過區域。也許你可以爲此提出一個新問題。 – Sam 2016-09-29 21:24:45

+0

用於詳細解釋助手和功能之間的區別以及使用它們的方式 – 2018-02-06 16:37:42