42

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

4

4 回答 4

58

@functions块允许您直接在视图中定义实用程序函数,而不是将它们作为扩展添加到@Html帮助程序或让控制器知道显示属性。当您满足以下条件时,您会想要使用它:

  1. 该功能与视图密切相关,通常在其他地方没有用(例如“我的列有多宽”)。
  2. 该功能不仅仅是一个简单的if语句,和/或在您的视图中的多个位置使用。
  3. 该函数需要确定其逻辑的所有内容都已存在于Model视图中。

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

如果第二个失败,只需内联它。

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

于 2012-12-20T15:44:04.150 回答
6

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

如果您的视图被键入到视图模型,我认为一个可行的选择是将这个逻辑移动到视图模型中,以避免使用太多代码使您的标记混乱。否则,您的视图开始看起来越来越像经典的 ASP,我认为没有人想要那样。

我不认为在你的视图中使用@functionsor有什么问题@helper,但是一旦你在视图中超越了几个方法,或者即使函数有些复杂,如果可能的话,可能值得重构视图模型。如果它是可以重用的代码,最好将其拉出到帮助类或 HtmlHelper 类的扩展中。一件令人沮丧的事情是意识到你只是重写了一段已经存在的代码,因为你不知道它被隐藏在某个任意视图中。

于 2012-12-20T16:14:47.450 回答
0

来自msdn blogs@functions 块是为了让您包装可重用的代码,如方法和属性

于 2012-12-20T15:31:09.810 回答
0

在这种特殊情况下,创建您正在使用的主题的人可能试图将其保留为一个简单的主题(仅视图、css 和图像)。

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

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

于 2012-12-20T15:36:11.350 回答