4

カスタムモジュールがあります。Migrations.cs は次のようになります。

    public int Create()
    {
        SchemaBuilder.CreateTable("MyModuleRecord", table => table
            .ContentPartRecord()
            ...
        );

        ContentDefinitionManager.AlterPartDefinition(
            typeof(MyModulePart).Name, cfg => cfg.Attachable());

        ContentDefinitionManager.AlterTypeDefinition("MyModule",
           cfg => cfg
                .WithPart("MyModulePart")
                .WithPart("CommonPart")
                .Creatable()
            );

        return 1;
    }

これは、コントローラーにあるコードです。

  var newcontent = _orchardServices.ContentManager.New<MyModulePart>("MyModule");
  ...
  _orchardServices.ContentManager.Create(newcontent);

Orchard.ContentManagement ContentCreateExtensions のこの New メソッドから無効なキャスト エラーが発生します。

    public static T New<T>(this IContentManager manager, string contentType) where T : class, IContent {
        var contentItem = manager.New(contentType);
        if (contentItem == null)
            return null;

        var part = contentItem.Get<T>();
        if (part == null)
            throw new InvalidCastException();

        return part;
    }

私が間違っていることは何ですか?

ありがとう。

これがハンドラーです。

public class MyModuleHandler : ContentHandler
{
    public MyModuleHandler(IRepository<MyModuleRecord> repository)
    {
        Filters.Add(StorageFilter.For(repository));
    }
}
4

2 に答える 2

7

InvalidCastExceptionコンテンツ アイテムに が添付されていないように見えるため、を取得していますMyModulePart

あなたのパーツのドライバーがあった場合、あなたのパーツをコンテンツアイテムに表示できるようにする暗黙のリンクがどこかにあります(これがどのように行われるかはわかりません。他の誰かが詳しく説明できるかもしれませんが、それはやるべきことですOrchard のコアの奥深くにあるシェイプ テーブルによって、シェイプがどのように収集および選択されるかを示します)。

ただし、ドライバーがない ActivatingFilterため、パーツのハンドラー クラスに を追加すると、リンクが明示的に作成されます。

public MyModulePartHandler : ContentHandler {
    public MyModulePartHandler() {
        Filters.Add(StorageFilter.For(repository));
        Filters.Add(new ActivatingFilter<MyModulePart>("MyModule");
    }
}
于 2012-04-23T19:18:47.367 に答える
0

パーツ テーブル名が間違っています。これに名前を変更してみてください (「レコード」の前の部分がパーツのモデル名と正確に一致するようにします):

    SchemaBuilder.CreateTable("MyModulePartRecord", table => table
        .ContentPartRecord()
        ...
    );
于 2012-04-22T02:59:42.107 に答える