【问题标题】:Umbraco Razor - Script fails using Children.RandomUmbraco Razor - 使用 Children.Random 的脚本失败
【发布时间】:2013-09-03 16:33:41
【问题描述】:

遇到一个奇怪的问题,希望大家多多指教。我正在使用 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)

谢谢大家!

【问题讨论】:

  • 代码中应该是@child.quoteText等而不是@item.
  • 是的 - 复制粘贴错误。我更新了 sn-p - 谢谢!
  • 你能用日志文件中的错误更新问题吗?应该有一个堆栈跟踪显示错误是什么。它们位于 ~/app_data/logs/
  • 感谢@Digbyswift - 我添加了错误。该消息的重要部分 - “umbraco.MacroEngines.DynamicNodeList”不包含“随机”的定义 - 令人困惑,因为我知道它确实支持随机并且已经有一段时间了。也许是一个过时的 RazorEngine dll?
  • 在查看了 dll 之后,我猜新版本不再使用 RazorEngine.dll。它有 System.Web.WebPages.Razor.dll 和 System.Web.Razor.dll。然后继续搜索...

标签: razor umbraco


【解决方案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()

【讨论】:

  • 添加@using 并没有解决它,所以我采用了你的长期方法,现在我在保存时得到了这个“不能使用 lambda 表达式作为动态调度操作的参数,而不首先进行强制转换它到一个委托或表达式树类型”。我当然很感激你和我在一起!谢谢
  • 有点晚了,但是你安装了 .net 4.5 吗?我看到 random 在我的生产站点上不起作用,但在 dev 上它工作正常 - 通常随机(和其他动态加载的扩展)在先决条件 dll 无法加载时失败(因为它们是动态解析的并且需要加载依赖项)跨度>
【解决方案2】:

这个怎么样:

var randomQuote = Library.NodeById(1113).ChildrenAsList.Items.GetRandom(1);

我认为 Model.NodeById 已经过时了。

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。我通过将一些项目返回到 .Random() 方法来解决它。例如:

    var galleryItems = imageGallery.Children.Random(50);
    

    或者在你的情况下(理论上):

    var item = @Model.NodeById(1113).Children.Random(1);
    

    但是,如果您这样做,您将收到一个包含一个项目的列表,因此您可能需要:

    var item = @Model.NodeById(1113).Children.Random(1).Take(1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多