Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何从代码中为Orchard ContentPickerField赋值?_C# 4.0_Orchardcms - Fatal编程技术网

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

C# 4.0 如何从代码中为Orchard ContentPickerField赋值?,c#-4.0,orchardcms,C# 4.0,Orchardcms,我在一个Orchard网站上工作,该网站需要能够使用一些定制的表单来创建新的内容项 为了处理这个问题,我使用一个控制器来显示一个表单,然后通过填充动态项并通过ContentManagerService的create()函数发送它们,尝试在回发时创建新的内容项 这是正常工作,直到我得到的内容选择器字段,我作为我的内容项目的一部分 在我的项目中,我有一个问题记录的内容类型,它有一个SubmittedBy字段,它是一个内容选择器字段 以下是我在处理回发邮件时在即时窗口中看到的内容: > dynamic

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

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

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

在我的项目中,我有一个问题记录的内容类型,它有一个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]} >dynamic q=\u questionService.NewQuestion(“为什么这不起作用?”); {Custom.Website.Models.Question} base{Orchard.ContentManagement.ContentPart}:{Custom.Website.Models.Question} 是新的:真的 原始问题:“为什么这不起作用?” 摘要:空 >问题记录 {Orchard.ContentManagement.ContentPart} 基本{System.Dynamic.DynamicObject}:{Orchard.ContentManagement.ContentPart} ContentItem:{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} >问题记录。提交人 {Orchard.ContentPicker.Fields.ContentPickerField} 基本{Orchard.ContentManagement.ContentField}:{Orchard.ContentPicker.Fields.ContentPickerField} ContentItems:null ID:{int[0]} ContentItems属性是只读的,当将新int[]分配给Ids数组时,Ids会收到System.ObjectDisposedException,并显示以下消息:无法解析实例,并且无法从此LifetimeScope创建嵌套的生存期,因为它已被释放

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


谢谢。

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

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

使用即时窗口有时会有挑战性,因此在本例中使用它似乎是在增加问题。将项目强制转换为dynamic:item.ContentTypeName.FieldName后,您可以访问字段谢谢您的回复。我可以通过即时窗口或代码访问字段ok,在本例中是SubmittedBy字段。我陷入困境的地方是该字段是ContentPickerField的一部分,我找不到一种方法以编程方式为其赋值。谢谢,Sipke。我在我的项目中尝试了上面的代码,并做了一些调整。submittedByField获取分配给它的正确字段,我可以看到它的属性具有id={int[0]}和null ContentItem。一旦我尝试将自己的int[]值分配给.Ids属性,我就会得到System.ObjectDisposedException,并显示以下消息:无法解析实例,并且无法从此LifetimeScope创建嵌套的生存期,因为它已被释放。我使用的是由hg回购协议构建的Orchard 1.7。我是否做了一些错误的事情,认为我可以在这里分配一个值,或者这是一个bug?更新-在分配到.Ids时仍然抛出ObjectDisposedException,但我后来注意到在调试器中,Ids字段包含了新的值!我将其包装在一个try/catch for ObjectDisposedException中,它在控制器代码中一直运行。当它完成时,内容项在数据库中保存了正确的值;var submittedByField=((动态)viewModel.Question.ContentItem)。QuestionRecord.SubmittedBy;请尝试{submittedByField.Ids=contact_Ids;}catch(System.ObjectDisposedException ex){/*值仍然被分配和保存,尽管引发了异常。*/},但该值不应引发异常。奇怪的是,您直接作为内容项的一部分访问QuestionRecord。通常人们会这样做(假设您的内容项有一个名为“QuestionPart”的部分):
var submittedByField=((动态)viewModel.Question.ContentItem)。QuestionPart.SubmittedBy;
var submittedByField = ((dynamic)q.ContentItem).Question.SubmittedBy;
sbmittedByField.Ids = new[] { submittedById };