Ich habe auf EPiServer 7 MVC hochgefahren und durch Joel Abrahamssons Alloy MVC Template gegangen. Nachdem ich einen Blick auf den angepassten Preview Controller geworfen habe, der einen Block in 4 verschiedenen 'Größen' anzeigt, hatte ich die Idee, eine Eigenschaft zu erstellen, die spezifisch für eine bestimmte 'Blockgröße' ist, so dass der Überschriftentext z Beispiel könnte unterschiedliche Inhalte basierend auf der "Größe" anzeigen, die der Block rendert. Im Wesentlichen wäre dies ein Dictionary, in dem der Schlüssel die "Größe" und der Wert den String-Inhalt enthält.EPiServer 7 - Dictionary-basierte benutzerdefinierte Eigenschaft Typ
Hat jemand solch eine Wörterbucheigenschaft gemacht?
Ich habe ein paar Ansätze ausprobiert und haben mit jedem stecken geblieben:
Benutzerdefinierte Objekttyp/custom Werttyp. Nach diesem Beispiel beim Erstellen von benutzerdefinierten Eigenschaftstypen (http://joelabrahamsson.com/creating-a-custom-episerver-property-with-a-custom-class-as-value/) habe ich einen benutzerdefinierten Eigenschaftstyp (PropertyDicitionaryString) und einen benutzerdefinierten Werttyp (DictionaryString) erstellt. Ich kann den Wert in Ordnung anzeigen, indem ich eine Anzeigevorlage implementiere, die ein Tag mit der Größe erhält und anschließend Model.MyDictionaryString [ViewData ["Tag"] als String darstellt). Ich habe jedoch nicht herausgefunden, wie die Inline-Bearbeitung funktioniert, da ein Aufruf von @ Html.EditAttributes (x => x.MyDictionaryString [ViewData ["Tag"] als String]) nicht unterstützt wird; Diese Methode unterstützt keine Index- oder Methodenaufrufe im Lambda-Ausdruck. Wer weiß, wie man einen solchen Inline-Editor erstellt?
Angepasster Eigenschaftstyp/primitiver Typ. Ich habe meinen benutzerdefinierten Eigenschaftstyp für oben überarbeitet, nennen wir ihn (PropertyDictionaryStringAsPrimitive), sodass die Value-Eigenschaft eine Zeichenfolge zurückgibt. Dies ermöglicht es mir mein Modell zu definieren, wie:
[BackingType(typeof(PropertyDictionaryStringAsPrimitive)] public virtual string SizeSpecificString{get;set;}
ich in einer Art und Weise zu hacken hatte für die PropertyDictionaryStringAsPrimitive der ‚Größe‘ in dem aktuellen Wiedergabe-Kontext zu empfangen, wenn es Wert Methode ist hieß es, um sicherzustellen, kehrte die korrekter Wert. Ich konnte dies tun, indem ich einen benutzerdefinierten ContentDataInterceptor implementierte, der nach Aufrufen von PropertyDictionaryStringAsPrimitive.Value sucht und den Schlüssel entsprechend einstellt. So, jetzt den Wert anzeigen funktioniert gut, aber Inline-Bearbeitung funktioniert auch nicht ganz. Wenn der Ajax-Speicheraufruf ausgeführt wird, muss ich einige Statusinformationen hinzufügen, damit ich PropertyDictionaryStringAsPrimitive mitteilen kann, welcher Schlüssel zum Speichern der Änderungen verwendet werden soll. Wer weiß, wie man zusätzliche Statusinformationen während einer Inline-Edit-Ajax-Speicheranforderung zurückgibt?
Ich schaute auf das Attribut
[CultureSpecific]
. Es wäre interessant, wenn ich einen ähnlichen Mechanismus wie CultureSpecific verwenden könnte, um bestimmte Instanzen der Werte "Größe" beizubehalten. Nachdem ich einige Zeit in einem Decompiler verbracht habe, der versucht herauszufinden, wie hwo CultureSpecific seine Magie ausübt, habe ich das Attribut CotnentDataAttributeScanningAssigner.AssignValuesToPropertyDefinition verfolgt und das PropertyDefinitionModel.CultureSpecific-Flag auf true gesetzt, welches PropertyDefinitionSynchronizer.CreatePropertyDefintion benutzt, um das PropertyDefinitionModel.CultureSpecificValue auf ein Enum zu setzen. Aber ich konnte nicht herausfinden, wie diese Einstellung beeinflusst, welcher Wert geladen wird. Kann jemand ein Property-Level-Attribut verwenden, um den Wert dynamisch zu ändern? (In einem Inhaltsbereich oder Blöcke) (benötigt wo) und ein Block-Eigenschaft für die Eigenschaftswerte
Wäre dies den Inhalt erfordern Redakteure, um Zollblöcke pro Größe zu erstellen, oder könnte ich nur 3 Textfelder (Desktop, Tablet, Telefon) sagen? –
Sie könnten einen Blocktyp mit 3 Zeichenfolgeneigenschaften erstellen und diesen Blocktyp dann als Ihren Inhaltseigenschaftstyp verwenden. Auf diese Weise erhalten Sie 3 gruppierte String-Eigenschaften in der Benutzeroberfläche und rendern diese dann entsprechend für verschiedene Geräte. –
Sie haben zufällig kein Codebeispiel? –