2015-01-16 23 views
6

Ich habe einen Inhaltsbereich, die einige Blöcke haben, müssen einige Attribute dieser Blöcke mit Daten aus einer SQL-Abfrage initialisiert werden, so in der Steuerung ich so etwas wie dieses:EpiServer - Hinzufügen Block zu einem Inhaltsbereich programmatisch

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

Was ich brauche, ist mit currentObject als Block arbeiten, und fügen Sie es zu einem Inhaltsbereich, den ich in einem anderen Block definiert habe. Ich habe versucht,

myContentArea.Add(currentObject) 

verwenden, aber es sagt, es ist nicht ein Objekt in einen Inhaltsbereich hinzufügen kann, weil es für einen IContent Typ erwartet.

Wie kann ich dieses Objekt in eine IContent?

Antwort

8

Um Inhalte in EPiServer erstellen Sie eine Instanz von IContentRepository statt new Operator verwenden:

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); 

Danach werden Sie den Block in den Inhaltsbereich hinzuzufügen fähig sein:

// 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 erstellt Proxyobjekte für Blöcke in Runtime und implementiert die Schnittstelle IContent. Wenn Sie IContent Mitglied in einem Block verwenden müssen, umwandeln Sie es explizit zu IContent.

Wenn Sie Blöcke mit dem Operator new erstellen, werden sie nicht in der Datenbank gespeichert. Ein anderes Problem ist der Inhaltsbereich, der solche Objekte nicht akzeptiert, da sie IContent intefrace nicht implementieren (Sie müssen Blöcke von IContentRepository abrufen, die Proxys in der Laufzeit erstellen).

+0

Danke für die Antwort, Es scheint wie es funktioniert, aber immer noch ein Problem, die Linie Repo.Save (newBlock, SaveAction.Publish); markiert einen Fehler, der besagt, dass die beste Überladung für Speichern einige ungültige Argumente hat, bereits versucht repo.Save (newBlock, SaveAction.Publish, AccessLevel.Administrator); und auch IContentRepository.Save (Repo, newBlock, saveAction.Publish) – rhernandez

+0

Ja, sieht aus wie das gleiche 'IContent'-Cast-Problem. Versuchen Sie 'repo.Save ((IContent) newBlock, SaveAction.Publish);' – whyleee

+0

Es funktioniert! Jetzt werden die Daten als Block angezeigt und editierbare Eigenschaften funktionieren einwandfrei. Nur eine weitere Frage (ich bin nicht sicher, ob ich einen anderen Thread öffnen würde) Die Blöcke werden korrekt hinzugefügt, aber wenn ich zur übergeordneten Komponente gehe, sieht die ContentArea leer aus, also habe ich überprüft und festgestellt, dass die Blöcke hinzugefügt werden Wie kann ich der Komponente, die im Bearbeitungsmodus angezeigt werden soll, im Ordner "Global Assests" "sagen"? Ich versuche mit dieser Lösung http://joelabrahamsson.com/custom-rendering-of-content-areas/, funktioniert aber bisher nicht für mich. Danke – rhernandez

Verwandte Themen