2

我需要连接到 Orchard CMS 中的 Creating 事件,并使用正在创建的内容的标题(以及其他一些属性)在 3rd 方系统中创建一个项目,并返回该 ID 以在内容类型中设置果园。

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

他们只是懒加载吗?有没有办法填充它们?覆盖任何形状方法(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.Titleandpart.Path为空。我需要尝试获取记录吗?(我没想到,因为那时还没有创建 Orchard CMS 记录)

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

4

1 回答 1

2

OnCreating/OnCreated构建项目对象时触发事件,而不是填充数据。

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

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

于 2013-11-10T23:40:57.507 回答