剃刀文件中的@functions代码块做什么,以及何时(如果有的话)我应该使用它?

时间:2012-12-20 15:22:46

标签: c# asp.net-mvc-3 razor orchardcms

在查看我从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 个答案:

答案 0 :(得分:54)

@functions块允许您直接在视图中定义实用程序功能,而不是将它们作为@Html帮助程序的扩展添加,或让控制器了解显示属性。您可以在满足以下条件时使用它:

  1. 该功能与视图紧密相关,在其他地方通常不常用(例如“我的栏目有多宽”)。
  2. 该功能不仅仅是简单的if语句,而且/或在视图中的多个位置使用。
  3. 该功能需要确定其逻辑的所有内容已存在于视图的Model中。
  4. 如果第一个失败,请将其添加为@Html帮助程序。

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

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

答案 1 :(得分:6)

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

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

我认为在您的视图中使用@functions@helper并没有任何问题,但是一旦您在视图中超越了几个方法,或者即使函数有点复杂,如果可能的话,可能值得重构视图模型。如果它是可以重用的代码,那么将它拉出到辅助类或HtmlHelper类的扩展可能是个好主意。有一件事是糟糕的是意识到你只是重写了一段已经存在的代码,因为你不知道它是隐藏在某个任意视图中的。

答案 2 :(得分:0)

msdn blogs开始, @functions块就是让你包装可重复使用的代码,比如方法和属性

答案 3 :(得分:0)

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

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

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