Chr*_*yne 41 c# orchardcms razor asp.net-mvc-3
在查看我从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 : "";
}
}
Run Code Online (Sandbox Code Playgroud)
我知道声明的函数做了什么(计算哪些区域被填充以返回每列的宽度),我的问题是 - @function块的正确使用是什么,我应该何时使用它?
Bob*_*son 54
该@functions块允许您直接在视图中定义实用程序功能,而不是将它们添加为@Html帮助程序的扩展或让控制器了解显示属性.您可以在满足以下条件时使用它:
if语句,和/或在视图中的多个位置使用.Model视图中.如果第一个失败,请将其添加为@Html帮助程序.
如果第二个失败,只需内联它.
如果第3个失败,则应在控制器中进行计算并将结果作为模型的一部分传递.
其他人已经解释了什么@functions,所以我不会重复这一点.但我想补充一点:
如果您的视图是为视图模型键入的,我认为一个可行的选择是将此逻辑移动到视图模型中,以避免使用过多代码来混淆标记.否则你的观点开始变得越来越像经典的ASP,我认为没有人想要那样.
我认为使用@functions或@helper在视图中没有任何问题,但是一旦你在视图中超越了几个方法,或者即使函数有点复杂,如果可能的话,可能值得重构viewmodel.如果它是可以重用的代码,那么将它拉出到辅助类或HtmlHelper类的扩展可能是个好主意.有一件事是无聊的是意识到你只是重写了一段已经存在的代码,因为你不知道它是隐藏在某个任意视图中的.
| 归档时间: |
|
| 查看次数: |
9691 次 |
| 最近记录: |