2013-09-03 2 views
0

У меня возникла странная проблема, надеясь, что у вас у всех есть какие-то указатели. Я использую Umbraco 4.11.10 и пытаюсь выполнить требование о отображении 1 случайной цитаты из коллекции котировок. Очень странно, что этот точный код работает на другом сайте, используя ту же версию Umbraco.
Объект Quote имеет только два свойства ... quoteText и quoteSignature. Вот мой весь скрипт бритвы (который в настоящее время терпит неудачу).Umbraco Razor - скрипт не работает с Children.Random

@inherits umbraco.MacroEngines.DynamicNodeContext 

@{ 
    var item = @Model.NodeById(1113).Children.Random(); 
    <div> 
      <blockquote>@item.quoteText<span>- @item.quoteSignature</span></blockquote> 
    </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, я надеюсь, что это просто надзор с моей стороны.

* UPDATE * Ошибка из журнала ошибок выглядит следующим образом

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

Должно ли это быть '@ child.quoteText' и т. Д. В коде, а не' @ item.'? – Digbyswift

+0

yep - ошибка копирования патча. Я обновил фрагмент - спасибо! – hardba11

+0

Не могли бы вы обновить вопрос с ошибкой из файлов журнала? Должна быть трассировка стека, показывающая, что такое ошибка. Они расположены в ~/app_data/logs/ – Digbyswift

ответ

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() 
+0

Добавление @using не разрешило его, поэтому я пошел с вашим долгосрочным подходом, теперь я получаю это при сохранении. «Нельзя использовать выражение лямбда в качестве аргумента для динамически отправленной операции без первого отбросив его до имени делегата или типа дерева выражений ". Я уверен, что ты висешь со мной на этом! Спасибо – hardba11

+0

Бит поздно, но у вас есть .net 4.5 установлен? Я вижу случайный, не работающий на моих производственных сайтах, но на dev он отлично работает. Обычно случайные (и другие динамически загружаемые расширения) терпят неудачу, когда требуемые DLL-файлы не загружаются (поскольку они динамически разрешены, и зависимости нужно загружать) – agrath

0

Как об этом:

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

Я думаю, Model.NodeById устарел.

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); 
Смежные вопросы