EpiServer - Add block to a content area programmatically

冷暖自知 提交于 2019-12-30 09:08:14

问题


I have a content area which will have some blocks, some attributes of these blocks must be initialized with data from a SQL query, so in the controller I have something like this:

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

What I need, is to work with currentObject as a block, and add it to a content area I have defined in another block. I tried using

myContentArea.Add(currentObject)

but it says it can't add an object into a content area because it is expecting for an IContent type.

How can I cast that object into an IContent?


回答1:


To create content in EPiServer you need to use an instance of IContentRepository instead of new operator:

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

After that you will be able to add the block to the content area:

// 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 creates proxy objects for blocks in runtime and they implement IContent interface. When you need to use IContent member on a block, cast it to IContent explicitly.

When you create blocks using new operator, they are not saved in the database. Another problem is content area doesn't accept such objects, because they don't implement IContent intefrace (you need to get blocks from IContentRepository which creates proxies in runtime).



来源:https://stackoverflow.com/questions/27993939/episerver-add-block-to-a-content-area-programmatically

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!