我正在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的管理界面非常有用。感谢。
答案 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实际上是隐式创建的部件的名称)。