0

いくつかのカスタマイズされたフォームを使用して新しいコンテンツ アイテムを作成できるようにする必要があるオーチャード サイトで作業しています。

これを処理するために、コントローラーを使用してフォームを表示し、動的アイテムを入力して ContentManagerService の Create() 関数を介して送信することにより、ポストバック時に新しいコンテンツ アイテムを作成しようとしています。

コンテンツ アイテムの一部として持っているコンテンツ ピッカー フィールドに到達するまで、これは正常に機能しています。

私のプロジェクトには、コンテンツ ピッカー フィールドである SubmittedBy フィールドを持つ質問レコードのコンテンツ タイプがあります。

ポストバックを処理しているときに、イミディエイト ウィンドウに表示される内容は次のとおりです。

    > dynamic q = _questionService.NewQuestion("なぜうまくいかないのですか?");
    {Custom.Website.Models.Question}
        ベース {Orchard.ContentManagement.ContentPart}: {Custom.Website.Models.Question}
        IsNew: 真
        元の質問: 「なぜこれが機能しないのですか?」
        要約: null
    > q.質問記録
    {Orchard.ContentManagement.ContentPart}
        ベース {System.Dynamic.DynamicObject}: {Orchard.ContentManagement.ContentPart}
        ContentItem: {Orchard.ContentManagement.ContentItem}
        フィールド: カウント = 5
        ID: 0
        PartDefinition: {Orchard.ContentManagement.MetaData.Models.ContentPartDefinition}
        設定: カウント = 0
        TypeDefinition: {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}
        ContentItems: null
        ID: {int[0]}

ContentItems プロパティは読み取り専用であり、新しい int[] を Ids 配列に割り当てると Ids System.ObjectDisposedException というメッセージが表示されます: インスタンスは解決できず、この LifetimeScope は既に破棄されているため、ネストされたライフタイムを作成できません。 .

この値をコードで設定するための回避策はありますか? または、関連するコンテンツ アイテム ID を格納するために独自のプロパティを作成する必要がありますか? ContentPickerField の管理インターフェイスも利用できると非常に便利です。

ありがとう。

4

1 に答える 1

2

ContentPickerField への参照がある場合は、Ids プロパティを使用して値を割り当てることができます。例 (コンテンツ タイプに、SubmittedBy というフィールドを持つ Question というパーツがあると仮定します):

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

バートランドが述べたように、コンテンツ フィールドにアクセスするための形式は contentItem.PartName.FieldName です。admin を介してタイプにフィールドを直接アタッチした場合、パーツ名はタイプ名と同じ名前になるため、 contentItem.TypeName.FieldName (ここで、TypeName は実際には暗黙的に作成されたパーツの名前です)。

于 2013-08-02T06:12:14.277 に答える