EpiServer - программно добавляет блок в область содержимого
У меня есть область содержимого, в которой будет несколько блоков, некоторые атрибуты этих блоков должны быть инициализированы данными из SQL-запроса, поэтому в контроллере у меня есть что-то вроде этого:
foreach (ObjectType item in MyList)
{
BlockData currentObject = new BlockData
{
BlockDataProperty1 = item.ItemProperty1,
BlockDataProperty2 = item.ItemProperty2
};
/*Dont know what to do here*/
}
Что мне нужно, это работать с currentObject
как блок, и добавить его в область содержимого, которую я определил в другом блоке. Я пытался с помощью
myContentArea.Add(currentObject)
но он говорит, что не может добавить объект в область содержимого, потому что он ожидает IContent
тип.
Как я могу бросить этот объект в IContent
?
1 ответ
Для создания контента в EPiServer вам нужно использовать экземпляр IContentRepository
вместо new
оператор:
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);
После этого вы сможете добавить блок в область контента:
// 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 создает прокси-объекты для блоков во время выполнения, и они реализуют IContent
интерфейс. Когда вам нужно использовать IContent
член на блоке, брось его IContent
в явном виде.
Когда вы создаете блоки, используя new
оператор, они не сохраняются в базе данных. Другая проблема заключается в том, что область содержимого не принимает такие объекты, потому что они не реализуют IContent
intefrace (вам нужно получить блоки от IContentRepository
который создает прокси во время выполнения).