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 который создает прокси во время выполнения).

Другие вопросы по тегам