2011-06-14 144 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