2015-01-16 14 views
6

Ho un'area di contenuto che avrà alcuni blocchi, alcuni attributi di questi blocchi devono essere inizializzati con dati da una query SQL, quindi nel controller ho qualcosa di simile:EpiServer - Aggiungi programmaticamente un'area di contenuto

foreach (ObjectType item in MyList) 
{ 
    BlockData currentObject = new BlockData 
    { 
     BlockDataProperty1 = item.ItemProperty1, 
     BlockDataProperty2 = item.ItemProperty2 
    }; 
    /*Dont know what to do here*/ 
} 

Quello che mi serve, è lavorare con currentObject come blocco e aggiungerlo a un'area di contenuto che ho definito in un altro blocco. Ho provato ad utilizzare

myContentArea.Add(currentObject) 

ma dice che non può aggiungere un oggetto in un area di contenuto, perché si aspetta per un tipo di IContent.

Come posso trasmettere quell'oggetto in un IContent?

risposta

8

per creare contenuti in EPiServer è necessario utilizzare un'istanza di IContentRepository invece di new dell'operatore:

var repo = ServiceLocator.Current.GetInstance<IContentRepository>(); 

// create writable clone of the target block to be able to update its content area 
var writableTargetBlock = (MyTargetBlock) targetBlock.CreateWritableClone(); 

// create and publish a new block with data fetched from SQL query 
var newBlock = repo.GetDefault<MyAwesomeBlock>(ContentReference.GlobalBlockFolder); 

newBlock.SomeProperty1 = item.ItemProperty1; 
newBlock.SomeProperty2 = item.ItemProperty2; 

repo.Save((IContent) newBlock, SaveAction.Publish); 

Dopo che si sarà in grado di aggiungere il blocco per l'area del contenuto:

// add new block to the target block content area 
writableTargetBlock.MyContentArea.Items.Add(new ContentAreaItem 
{ 
    ContentLink = ((IContent) newBlock).ContentLink 
}); 

repo.Save((IContent) writableTargetBlock, SaveAction.Publish); 

EPiServer crea oggetti proxy per i blocchi in runtime e implementa l'interfaccia IContent. Quando è necessario utilizzare il membro IContent su un blocco, convertirlo in IContent in modo esplicito.

Quando si creano blocchi utilizzando l'operatore new, non vengono salvati nel database. Un altro problema è che l'area del contenuto non accetta tali oggetti, perché non implementano l'intefrace IContent (è necessario ottenere blocchi da IContentRepository che crea proxy in runtime).

+0

Grazie per la risposta, sembra funzionare, ma hanno ancora un problema, la riga repo.Save (newBlock, SaveAction.Publish); segnala un errore dicendo che il migliore sovraccarico per Salva ha alcuni argomenti non validi, già provato repo.Save (newBlock, SaveAction.Publish, AccessLevel.Administer); e anche IContentRepository.Save (repo, newBlock, saveAction.Publish) – rhernandez

+0

Sì, sembra lo stesso problema di cast di "IContent'. Prova 'repo.Save ((IContent) newBlock, SaveAction.Publish);' – whyleee

+0

Funziona! ora sta mostrando i dati come un blocco e le proprietà modificabili stanno funzionando bene. Solo un'altra domanda (non sono sicuro di dover aprire un altro thread) i blocchi vengono aggiunti correttamente, ma quando vado al componente principale, ContentArea sembra vuoto, quindi ho controllato e ho capito che i blocchi sono stati aggiunti a la cartella di analisi globale, come posso "dire" al componente di essere mostrato nell'area di contenuto in modalità di modifica? Sto provando con questa soluzione http://joelabrahamsson.com/custom-rendering-of-content-areas/ ma non funziona per me finora. Grazie – rhernandez

Problemi correlati