如何在Orchard CMS中的Creating事件期间访问Part属性

时间:2013-11-07 09:56:34

标签: c# events handler orchardcms

我需要挂钩Orchard CMS中的Creating事件并使用正在创建的内容的标题(以及其他一些属性)在第三方系统中创建项目并返回要在其中设置的项目的ID Orchard的内容类型。

我有自定义内容类型,但是当我尝试挂钩事件时(如文档here中所述,并且通过查看内置Orchard Core内容部分中的代码),所有属性都为null。

他们只是懒得装吗?有没有办法填充它们?覆盖任何形状方法(GetItemMetadata / BuildDisplayShape / BuildEditorShape / UpdateEditorShape)似乎都不正确,因为这应该只在最初创建内容类型时触发。

我的代码是:

public MyContentPartHandler(IRepository<MyContentPartRecord> repository, IOrchardServices orchardServices, Lazy<IMyContentPartService> myContentPartService) {
    _orchardServices = orchardServices;
    _myContentPartService = myContentPartService;
    Filters.Add(StorageFilter.For(repository));

    OnCreating<MyContentPart>(CreateTPItemAndAssignIdentity);
}
protected void CreateTPItemAndAssignIdentity(CreateContentContext context, MyContentPart part)
{
    //create item in 3rd party system
    var item = _myContentPartService.Value.CreateNewItem(part.Title, part.Path);
    part.ExternalIdentity = item.FriendlyId;
}

CreateNewItem()方法失败,因为part.Titlepart.Path为空。我是否需要尝试获取记录? (我没想过,因为那时还没有创建Orchard CMS记录)

更新 - 我也尝试使用OnCreated事件,但是我遇到了与未填充的属性相同的问题。我在代码中放置了一个断点,并注意到当OnCreated断点被击中时 - 那时数据实际上并不存在于数据库中。

1 个答案:

答案 0 :(得分:2)

构造项目对象时会触发

OnCreating/OnCreated个事件,而不会填充数据。

如果您想确保数据已经存在,请使用OnPublished事件(项目更新后触发)或OnLoading/OnLoaded事件,如果您想在项目之后运行某些代码从数据库中完全加载。

This对某些事件的描述可能也会有所帮助。