在razor文件中的@functions代码块是做什么的,什么时候(如果曾经)我应该使用它?

虽然看着我从Orchard CMS图库下载的主题,但是我注意到一个Layout.cshtml文件在这个文件的顶部有这个代码块:

@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块的正确用法是什么,什么时候应该使用它?

@functions块允许你直接在视图中定义效用函数,而不是把它们作为@Html助手的扩展名,或者让控制器知道显示属性。 您可以在满足以下条件时使用它:

  1. function与视图密切相关,并且在其他地方通常不是很有用(例如“我的列有多宽”)。
  2. 该function不仅仅是一个简单的if语句,并且/或者在视图中的多个位置使用。
  3. 视图Model已经存在的所有function需要确定它的逻辑。

如果第一个失败,请将其添加为@Html助手。

如果你失败了第二个,只是内联。

如果第三个失败,则应该在控制器中进行计算,并将结果作为模型的一部分。

其他人已经解释了什么@functionsfunction,所以我不会重复这一点。 但我想补充一点:

如果你的视图被input到视图模型,我认为一个可行的select是将这个逻辑移入视图模型,以避免用太多的代码混淆你的标记。 否则,你的观点开始越来越像传统的ASP,我不认为有人想要。

我不认为在你的视图中使用@functions或者@helper是没有问题的,但是一旦你在视图中超出了一些方法,或者即使这个函数有些复杂,也可能是值得重构的viewmodel if尽可能地。 如果代码是可以重用的,那么把它拉入到一个辅助类或HtmlHelper类的扩展中可能是个好主意。 有一件令人失望的事情是意识到你只是重写了一段已经存在的代码,因为你不知道它隐藏在一些任意的视图中。

从msdn博客 , @functions块是让你包装可重复使用的代码,如方法和属性

在这个特殊的情况下,创build你正在使用的主题的人可能试图把它作为一个简单的主题(只有视图,CSS和图像)。

如果你需要为Orchard的主题编写一些代码,你必须转向一个模块(如这里所述: http : //docs.orchardproject.net/Documentation/Anatomy-of-a-theme ),除非你写这个代码在视图中。

我不确定是否值得花时间从主题切换到模块来获取列的大小。