2013-09-03 4 views
0

이상한 문제가 발생하여 모든 조언이 필요합니다. 나는 Umbraco 4.11.10을 사용하고 따옴표 모음에서 무작위 따옴표를 1 개 표시하는 요구 사항을 충족하려고합니다. 정말 놀랍게도이 정확한 코드는 Umbraco의 동일한 버전을 사용하는 다른 사이트에서 작동한다는 것입니다.
Quote 객체에는 quoteText와 quoteSignature의 두 가지 속성 만 있습니다. 여기에 내 전체 면도기 스크립트 (현재 실패)가 있습니다. Umbraco 면도기 - 어린이 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()을 사용하여 문제가되는 것 같습니다. 내가 면도기에 꽤 새로운 것에 따라 나는 이것이 나의 일부 위에서 단지 감시다고 희망하고있다.

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) 

감사합니다 모든 사람을 다음과 같이

* UPDATE *이 오류 로그에서 오류입니다!

+0

'@ item.'이 아닌 코드에서'@ child.quoteText' 등이되어야합니까? – Digbyswift

+0

예 - 복사 붙여 넣기 오류입니다. 스 니펫 업데이트 - 감사합니다! – hardba11

+0

로그 파일의 오류로 질문을 업데이트 할 수 있습니까? 오류가 무엇인지 보여주는 스택 추적이 있어야합니다. 그들은 ~/app_data/logs/ – Digbyswift

답변

1

DLL에서 반드시 불일치라고 생각하지 않습니다. 나는 v6 소스를 보았고 Random() 코드가 아직 남아있다.

public static DynamicNode Random(this DynamicNodeList all) 
{ 
    return all.Items.OrderBy(x => Guid.NewGuid()).First(); 
} 

그래서 문제가 매크로 네임 스페이스 umbraco.MacroEngines를 참조되지 않도록 할 것 같다 :

그것은 umbraco.MacroEngines.ExtensionMethods 클래스의 부분입니다. 전이나 @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 item = @Model.NodeById(1113).Children.Random(1); 

그러나, 당신은 하나 개의 항목으로 목록을 받게됩니다, 그래서 당신은 아마 필요 :

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

또는 (이론) 귀하의 경우

var item = @Model.NodeById(1113).Children.Random(1).Take(1); 
관련 문제