2013-08-09 33 views
5

Ho fatto un aumento su EPiServer 7 MVC e ho analizzato Joel Abrahamsson's Alloy MVC Template. Dopo aver dato un'occhiata al controller di anteprima personalizzato, che prevede l'anteprima di un blocco in 4 diverse "dimensioni" che potrebbero essere renderizzate, ho avuto l'idea di creare una proprietà specifica per un determinato "formato" in modo che il testo dell'intestazione, per esempio, potrebbe visualizzare diversi contenuti in base alla "dimensione" che il blocco esegue. Essenzialmente, questo sarebbe un dizionario in cui la chiave è la "dimensione" e il valore conterrebbe il contenuto della stringa.EPiServer 7 - Tipo di proprietà personalizzata basato sul dizionario

Qualcuno ha creato una proprietà di questo tipo?

Ho provato alcuni approcci e hanno ottenuto bloccato con ciascuno di essi:

  1. misura Tipo di proprietà/custom tipo di valore. Seguendo questo esempio sulla creazione di tipi di proprietà personalizzate (http://joelabrahamsson.com/creating-a-custom-episerver-property-with-a-custom-class-as-value/) ho creato un tipo di proprietà personalizzata (PropertyDicitionaryString) e un tipo di valore personalizzato (DictionaryString). Posso visualizzare il valore fine implementando un modello di visualizzazione che riceve un tag con le dimensioni e quindi rende Model.MyDictionaryString [ViewData ["Tag"] come stringa]. Tuttavia, non ho capito come far funzionare la modifica in linea, poiché una chiamata a @ Html.EditAttributes (x => x.MyDictionaryString [ViewData ["Tag"] come stringa]) non è supportata; quel metodo non supporta le chiamate di indice o di metodo nell'espressione lambda). Qualcuno sa come creare un tale editor in linea?

  2. Tipo di proprietà personalizzata/tipo primitivo. Ho rielaborato il mio tipo di proprietà personalizzata per sopra, chiamiamolo (PropertyDictionaryStringAsPrimitive) in modo che la proprietà Value restituisca una stringa. Questo mi permette di definire il mio modello come:

    [BackingType(typeof(PropertyDictionaryStringAsPrimitive)] public virtual string SizeSpecificString{get;set;}

    ho dovuto incidere in un modo per il PropertyDictionaryStringAsPrimitive per ricevere la 'dimensione' nel contesto di rendering corrente quando è il metodo valore è stato chiamato per assicurarsi che ha restituito il valore corretto. Sono riuscito a farlo implementando un ContentDataInterceptor personalizzato, che cerca le chiamate a PropertyDictionaryStringAsPrimitive.Value e imposta la chiave in modo appropriato. Quindi ora mostra che il valore funziona bene, ma anche la modifica in linea non funziona. Quando viene effettuata la chiamata di salvataggio ajax, devo aggiungere alcune informazioni di stato in modo da poter dire a PropertyDictionaryStringAsPrimitive quale chiave utilizzare per salvare le modifiche in. Qualcuno sa come passare ulteriori informazioni di stato indietro durante una modifica in linea richiesta di salvataggio ajax?

  3. Ho dato un'occhiata all'attributo [CultureSpecific]. Sarebbe interessante se potessi usare un meccanismo simile a CultureSpecific per mantenere istanze specifiche dei valori 'dimensionali'. Dopo aver trascorso un po 'di tempo in un decompilatore che cerca di elaborare hwo CultureSpecific funziona con la sua magia, ho rintracciato l'attributo a CotnentDataAttributeScanningAssigner.AssignValuesToPropertyDefinition impostando il flag PropertyDefinitionModel.CultureSpecific su true, che PropertyDefinitionSynchronizer.CreatePropertyDefintion utilizza per impostare PropertyDefintiionModel.CultureSpecificValue su un Enum. Ma non sono riuscito a scoprire come questa impostazione influenzi quale valore viene caricato. Qualcuno sa come utilizzare un attributo del livello di proprietà per modificare il valore in modo dinamico?

risposta

3

Io di solito evitare i tipi di proprietà personalizzati, preferisco attaccare editor personalizzati (dove necessario) e una proprietà di blocco (o blocchi in un area di contenuto) per i valori delle proprietà.

Forse un approccio praticabile potrebbe essere quella di:

1) Creare un tipo di blocco come SizeSpecificHeadingBlock con:

  1. Una proprietà stringa denominata Dimensioni con un SelectOne attributo configurato per un SelectionFactory restituire le opzioni di confine dimensione valida
  2. Un'altra stringa p ROPRIETÀ Rubrica per la rubrica testo vero e proprio

Poi si potrebbe aggiungere un ContentArea con allowedtypes insieme a SizeSpecificHeadingBlock.

Durante il rendering di ContentArea, devi semplicemente rendere l'intestazione della dimensione corrente.

Tuttavia, questo richiederebbe agli editor di creare un blocco per variazione di intestazione, che è un po 'macchinoso - ma è possibile integrare questo approccio con un editor personalizzato per semplificare il processo.

L'utilizzo di un modo nativo per memorizzare valori di proprietà (anziché un tipo di proprietà personalizzato) rende l'implementazione più a prova di futuro. Inoltre, se il tuo editor personalizzato dovesse mai fallire, puoi sempre disabilitarlo e utilizzare l'interfaccia utente di EPiServer "vanilla" per editare i tuoi valori di proprietà.

Edit: Anche se attualmente in versione beta, potrebbe essere rilevante per fare uso di PropertyList <YourCustomType> per questo tipo di scenario, per evitare di dover creare blocchi annidati: http://world.episerver.com/blogs/Per-Magne-Skuseth/Dates/2015/11/trying-out-propertylistt/

+0

sarebbe questo richiedere il Contenuto Redattori per creare un blocco doganale per dimensione, o potrei dire solo 3 caselle di testo (desktop, tablet, telefono)? –

+0

È possibile creare un tipo di blocco con 3 proprietà stringa, quindi utilizzare tale tipo di blocco come tipo di proprietà del contenuto. In questo modo otterresti 3 proprietà di stringa raggruppate nell'interfaccia utente e quindi le visualizzi in modo appropriato per la visualizzazione per dispositivi diversi. –

+0

Non hai un campione di codice per caso? –

Problemi correlati