在查看我从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块的正确用法是什么,我什么时候应该使用它?
答案 0 :(得分:54)
@functions
块允许您直接在视图中定义实用程序功能,而不是将它们作为@Html
帮助程序的扩展添加,或让控制器了解显示属性。您可以在满足以下条件时使用它:
if
语句,而且/或在视图中的多个位置使用。Model
中。如果第一个失败,请将其添加为@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),除非您在视图中编写此代码。
我不确定是否值得花时间从主题切换到模块只是为了获得列的大小。