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 中的这个新方法中得到了无效的转换错误。

    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 回答