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

use*_*317 4 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;
    }
Run Code Online (Sandbox Code Playgroud)

这是我在控制器中的代码.

  var newcontent = _orchardServices.ContentManager.New<MyModulePart>("MyModule");
  ...
  _orchardServices.ContentManager.Create(newcontent);
Run Code Online (Sandbox Code Playgroud)

我从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;
    }
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

谢谢.

这是处理程序.

public class MyModuleHandler : ContentHandler
{
    public MyModuleHandler(IRepository<MyModuleRecord> repository)
    {
        Filters.Add(StorageFilter.For(repository));
    }
}
Run Code Online (Sandbox Code Playgroud)

mdm*_*mdm 7

你得到的是InvalidCastException因为内容项似乎没有你的MyModulePart附件.

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

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

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