我有一个奇怪的问题,希望你们都有一些指示。我正在使用Umbraco 4.11.10并尝试满足从一组引号中显示1个随机引用的要求。真正令人费解的是,这个确切的代码使用相同版本的Umbraco在不同的网站上工作 Quote对象只有两个属性... quoteText和quoteSignature。这是我的整个剃刀脚本(目前失败)。
@inherits umbraco.MacroEngines.DynamicNodeContext
@{
var item = @Model.NodeById(1113).Children.Random();
<div>
<blockquote>@item.quoteText<span>- @item.quoteSignature</span></blockquote>
</div>
}
如果我删除div并阻止引用和所有这些,只需离开
var item = @Model.NodeById(1113).Children.Random();
它仍然失败。
如果我删除Random()并输出@item变量,则它是DynamicNodeList。如果我这样做......
foreach(var child in item)
{
<div>
<blockquote>@child.quoteText<span>- @child.quoteSignature</span></blockquote>
</div>
}
它有效,但我当然得到了所有的引用。所以我想至少证明数据是有效的,属性名称是有效的。使用Random()似乎是一个问题。因为我对Razor很新,所以我希望这只是我的疏忽。
* 更新* 错误日志中的错误如下
2013-09-03 19:34:00,142 [11] WARN umbraco.macro - [Thread 24] Error loading MacroEngine script (file: CFRandomQuote.cshtml, Type: ''. Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'umbraco.MacroEngines.DynamicNodeList' does not contain a definition for 'Random'
at CallSite.Target(Closure , CallSite , Object , Int32 )
at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
at ASP._Page_macroScripts_CFRandomQuote_cshtml.Execute() in c:\inetpub\cf\macroScripts\CFRandomQuote.cshtml:line 5
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.WebPages.WebPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at umbraco.MacroEngines.RazorMacroEngine.ExecuteRazor(MacroModel macro, INode currentPage)
at umbraco.MacroEngines.RazorMacroEngine.Execute(MacroModel macro, INode currentPage)
at umbraco.macro.loadMacroScript(MacroModel macro)
at umbraco.macro.renderMacro(Hashtable pageElements, Int32 pageId)
谢谢大家!
答案 0 :(得分:1)
我认为这不一定是DLL中的差异。我已经浏览了v6源代码,Random()
代码仍在那里。
它是umbraco.MacroEngines.ExtensionMethods
类的一部分:
public static DynamicNode Random(this DynamicNodeList all)
{
return all.Items.OrderBy(x => Guid.NewGuid()).First();
}
所以问题似乎是你的宏没有引用名称空间umbraco.MacroEngines
。在@inherits
:
@using umbraco.MacroEngines
如果这不起作用,那么只需执行查询:
@Model.NodeById(1113).ChildrenAsList
.OrderBy(n => Guid.NewGuid())
.FirstOrDefault()
答案 1 :(得分:0)
这个怎么样:
var randomQuote = Library.NodeById(1113).ChildrenAsList.Items.GetRandom(1);
我认为Model.NodeById已经过时了。
答案 2 :(得分:0)
我有类似的问题。我通过传递一些项来解决它,返回到.Random()方法。 EG:
var galleryItems = imageGallery.Children.Random(50);
或者在你的情况下(理论上):
var item = @Model.NodeById(1113).Children.Random(1);
但是,如果您这样做,您将收到一个包含一个项目的列表,因此您可能需要:
var item = @Model.NodeById(1113).Children.Random(1).Take(1);