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

C# razor文件中的@functions代码块是做什么的?我应该在什么时候(如果有的话)使用它?,c#,asp.net-mvc-3,razor,orchardcms,C#,Asp.net Mvc 3,Razor,Orchardcms,在查看我从Orchard CMS gallery下载的主题时,我注意到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 follo

在查看我从Orchard CMS gallery下载的主题时,我注意到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 : "";
}
}
@函数{
//支持下面的布局分类。作为razor函数实现,因为我们可以,否则可能是下面代码块中的Func。
字符串CalculateClassify(字符串[]zoneNames,字符串classNamePrefix)
{
var zoneCounter=0;
var zoneumsfilled=string.Join(“,zoneNames.Select(zoneName=>{++zoneCounter;返回模型[zoneName]!=null?zoneCounter.ToString():”;}).ToArray();
返回HasText(ZoneumsFilled)?classNamePrefix+ZoneumsFilled:;
}
}

我知道声明的函数是做什么的(计算填充哪些区域以返回每列的宽度),我的问题是-@function块的正确用法是什么,我应该什么时候使用它?

From,@functions块让您包装可重用的代码,就像在这种特殊情况下的方法和属性一样,创建您正在使用的主题的人可能试图将其保持为一个简单的主题(仅视图、css和图像)

如果您需要为Orchard的主题编写一些代码,那么您必须转向一个模块(如下所述:),除非您在视图中编写此代码


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

使用
@functions
块可以直接在视图中定义实用程序函数,而不是将它们作为
@Html
辅助程序的扩展添加,或者让控制器知道显示属性。在满足以下条件时,您可能希望使用它:

  • 该功能与视图紧密相关,在其他地方通常没有用处(例如“我的列有多宽”)
  • 该功能不仅仅是一个简单的
    if
    语句,而且/或在视图中的多个位置使用
  • 函数确定其逻辑所需的所有内容都已存在于视图的
    模型中
  • 如果第一次失败,请将其添加为
    @Html
    帮助程序

    如果第二次失败,只需将其内联即可


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

    其他人已经解释了
    @functions
    的作用,因此我不再重复。但我想补充一点:

    如果将视图类型化为viewmodel,我认为一个可行的选择是将此逻辑移到viewmodel中,以避免标记中的代码过多。否则,您的视图看起来越来越像经典的ASP,我认为没有人希望这样


    我认为在您的视图中使用
    @函数
    @helper
    没有任何问题,但是一旦您在视图中超越了几个方法,或者即使函数有点复杂,如果可能的话,也可能值得对viewmodel进行重构。如果它是可以重用的代码,那么最好将其拉入helper类或HtmlHelper类的扩展。令人沮丧的一件事是,你意识到你只是重写了一段已经存在的代码,因为你不知道它隐藏在某个任意视图中。

    我个人认为应该避免这样做,因为它只是混淆了你的表示/视图层和你的业务控制器/层。@Liam-我不同意。我认为它应该明确用于避免弄脏水体的目的。在本例中,它用于确定列宽,控制器甚至不应该知道列宽。+1。这是一个很好的答案。有理由使用
    @函数
    ,但不是经常使用!回答得很好,特别是关于解释你应该使用的替代方案的部分:Dhi Bobson,你的意思是我们不能在其他文件中使用@functions block?@GeorgiKovachev-据我所知,这是正确的。功能块的内容仅在同一文件中有效。不过,我从来没有真正尝试过,所以可能有一些变体可以用于包含不同文件的函数。不过我觉得这很奇怪。@GeorgiKovachev如果你想在其他视图中使用它们,你可以创建
    剃刀助手
    ,而不是
    函数
    。不要忘记将@helpers放在
    App\u code
    中,以使它们在全球可见。然后,您可以在任何视图中使用这些帮助程序,方法是在它们前面加上包含剃须刀帮助程序的文件名。