如何从代码中为Orchard ContentPickerField赋值?

时间:2013-07-31 23:16:58

标签: c#-4.0 orchardcms

我正在Orchard网站上工作,该网站需要能够使用一些自定义表单来创建新的内容项。

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

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

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

以下是处理回发后我在即时窗口中可以看到的内容:


    > dynamic q = _questionService.NewQuestion("Why doesn't this work?");
    {Custom.Website.Models.Question}
        base {Orchard.ContentManagement.ContentPart}: {Custom.Website.Models.Question}
        IsNew: true
        OriginalQuestion: "Why doesn't this work?"
        Summary: null
    > q.QuestionRecord
    {Orchard.ContentManagement.ContentPart}
        base {System.Dynamic.DynamicObject}: {Orchard.ContentManagement.ContentPart}
        ContentItem: {Orchard.ContentManagement.ContentItem}
        Fields: Count = 5
        Id: 0
        PartDefinition: {Orchard.ContentManagement.MetaData.Models.ContentPartDefinition}
        Settings: Count = 0
        TypeDefinition: {Orchard.ContentManagement.MetaData.Models.ContentTypeDefinition}
        TypePartDefinition: {Orchard.ContentManagement.MetaData.Models.ContentTypePartDefinition}
        Zones: {Orchard.UI.ZoneCollection}
    > q.QuestionRecord.SubmittedBy
    {Orchard.ContentPicker.Fields.ContentPickerField}
        base {Orchard.ContentManagement.ContentField}: {Orchard.ContentPicker.Fields.ContentPickerField}
        ContentItems: null
        Ids: {int[0]}

ContentItems属性是只读的,当Ids数组分配新的int []时,我得到一个带有消息的System.ObjectDisposedException:实例无法解析,并且无法从此LifetimeScope创建嵌套生命周期,因为它具有已被处置。

是否有任何变通方法可以在代码中设置此值,还是需要创建自己的属性来存储相关的内容项ID?

可以使ContentPickerField的管理界面非常有用。

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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