0

我正在开发一个需要能够使用一些自定义表单来创建新内容项的 Orchard 站点。

为了处理这个问题,我使用一个控制器来显示一个表单,然后尝试通过填充动态项目然后通过 ContentManagerService 的 Create() 函数发送它们来在回发时创建新的内容项目。

这一切正常,直到我到达作为内容项一部分的内容选择器字段。

在我的项目中,我有一个问题记录的内容类型,它有一个 SubmittedBy 字段,它是一个内容选择器字段。

这是我在处理回帖时在即时窗口中可以看到的内容:

    > dynamic q = _questionService.NewQuestion("为什么这不起作用?");
    {Custom.Website.Models.Question}
        基础 {Orchard.ContentManagement.ContentPart}:{Custom.Website.Models.Question}
        是新的:真
        原始问题:“为什么这不起作用?”
        摘要:空
    > q.问题记录
    {果园.内容管理.内容部分}
        基础 {System.Dynamic.DynamicObject}:{Orchard.ContentManagement.ContentPart}
        内容项:{Orchard.ContentManagement.ContentItem}
        字段:计数 = 5
        编号:0
        PartDefinition:{Orchard.ContentManagement.MetaData.Models.ContentPartDefinition}
        设置:计数 = 0
        类型定义:{Orchard.ContentManagement.MetaData.Models.ContentTypeDefinition}
        TypePartDefinition:{Orchard.ContentManagement.MetaData.Models.ContentTypePartDefinition}
        区域:{Orchard.UI.ZoneCollection}
    > q.QuestionRecord.SubmittedBy
    {Orchard.ContentPicker.Fields.ContentPickerField}
        基础 {Orchard.ContentManagement.ContentField}:{Orchard.ContentPicker.Fields.ContentPickerField}
        内容项:空
        标识:{int[0]}

ContentItems 属性是只读的,在将新的 int[] 分配给 Ids 数组时的 Ids 我收到 System.ObjectDisposedException 消息:无法解析实例,并且无法从此 LifetimeScope 创建嵌套生命周期,因为它已经被释放.

是否有任何解决方法可以在代码中设置此值,或者我是否需要创建自己的属性来存储相关的内容项 ID?让 ContentPickerField 的管理界面也可用会非常有帮助。

谢谢。

4

1 回答 1

2

如果您有对 ContentPickerField 的引用,则可以使用 Ids 属性为其分配一个值。在示例中(假设您的内容类型有一个名为 Question 的部分,其中有一个名为 SubmittedBy 的字段):

var submittedByField = ((dynamic)q.ContentItem).Question.SubmittedBy;
sbmittedByField.Ids = new[] { submittedById };

正如 Bertrand 所提到的,访问内容字段的格式是:contentItem.PartName.FieldName。如果您直接通过管理员将字段附加到类型,则部件名称与类型名称具有相同的名称,因此 contentItem.TypeName.FieldName(其中 TypeName 实际上是隐式创建的部件的名称)。

于 2013-08-02T06:12:14.277 回答