2016-03-30 2 views
0

In einem Teilansichtsmakro versuche ich den ersten Vorgänger- oder Selbstknoten zu erhalten, der eine Eigenschaft namens "breakInheritance" enthält und den Wert True hat. Ich habe diese Aussage/Abfrage seit ungefähr einer Stunde angegriffen, während ich um SO und die Our.Umbraco Foren jage, aber ich fürchte, dass ich nirgendwohin komme. Ich denke, das sollte ziemlich geradlinig sein.So erhalten Sie den ersten Elternknoten mit boolescher Eigenschaft in Umbraco 7

Abfrage

var nodeToUse = CurrentPage.AncestorOrSelf(x => (x.HasProperty("breakInheritance") && x.GetPropertyValue<bool>("breakInheritance"))); 

Der Lambda-Ausdruck in rot unterstrichen wird und sagt - Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

Ich habe Tonnen von Ressourcen zu diesem Fehler gefunden, aber in allen Fällen, die ich gesehen habe Es ist eine benutzerdefinierte Erweiterungsmethode, die sie einfach bearbeiten können, also hat es mir nicht wirklich geholfen.

Antwort

3

Casting würde ich sagen es die strongly typed API mit dem dynamic API nicht mischen besser. In Ihrem Code können Sie entweder CurrentPage.AncestorsOrSelf odereingeben, wobei das erste Beispiel eindeutig einen Lambda-Ausdruck nicht akzeptiert, wie die Fehlermeldung anzeigt.

Versuchen Sie Folgendes statt:

var node = Model.Content.AncestorsOrSelf() 
         .FirstOrDefault(n => n.HasProperty("breakInheritance") && 
              n.GetPropertyValue<bool>("breakInheritance")) 
+0

Das ist großartig, vielen Dank für die Tipps. Ich hatte auch keine Ahnung, dass Sie einen Lambda-Ausdruck an die Erweiterungsmethode FirstOrDefault() übergeben können. – user3267755

+1

Gern geschehen. Ein weiterer Trick besteht darin, den Dokumenttyp-Alias ​​an "AncestorsOrSelf" ("docTypeAlias") zu übergeben, was es Ihnen ermöglichen könnte, basierend auf dem Dokumenttyp zu filtern, anstatt ".HasProperty()" zu verwenden. Es ist vielleicht nicht immer möglich, aber ich bevorzuge das, weil Eigenschaftsnamen/Aliase sich im Allgemeinen häufiger ändern als Dokumenttypen. – elolos

0

Ich konnte das gewünschte Verhalten erhalten, indem die AncestorsOrSelf Methode zu IEnumerable<IPublishedContent>

var nodeToUse = ((IEnumerable<IPublishedContent>)CurrentPage 
    .AncestorsOrSelf()) 
    .Where(x => (x.HasProperty("breakInheritance") && x.GetPropertyValue<bool>("breakInheritance") && x.HasValue("widgets"))) 
    .FirstOrDefault(); 
Verwandte Themen