创建内容错误 - 指定的强制转换无效

时间:2012-04-21 23:57:02

标签: orchardcms

我有一个自定义模块。 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));
    }
}

2 个答案:

答案 0 :(得分:7)

您收到InvalidCastException,因为内容项似乎没有附加MyModulePart

如果你有一个驱动程序,那么在某个地方有一个隐含的链接允许你的部分显示在一个内容项目上(我不知道这是怎么做的,也许其他人可以详细说明 - 但是它与Orchard核心深处的形状表收获和拾取形状有关。

但是,由于您没有驱动程序,因此在您的部件处理程序类中添加ActivatingFilter将明确指定链接:

public MyModulePartHandler : ContentHandler {
    public MyModulePartHandler() {
        Filters.Add(StorageFilter.For(repository));
        Filters.Add(new ActivatingFilter<MyModulePart>("MyModule");
    }
}

答案 1 :(得分:0)

您的零件表名称错误。尝试将其重命名为此(因此“记录”之前的部分与您的零件型号名称完全匹配):

    SchemaBuilder.CreateTable("MyModulePartRecord", table => table
        .ContentPartRecord()
        ...
    );