如何在乌节路 CMS 中的创建事件期间访问部件属性



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

我有一个自定义内容类型,但是当我尝试挂钩到事件时(如此处的文档中所述,以及通过查看内置的 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.Titlepart.Path为空。我需要尝试记录吗?(我认为不是,因为当时还没有创建Orchard CMS记录)

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

OnCreating/OnCreated事件是在

构造项对象时触发的,而不是用数据填充的。

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

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

最新更新