0

我的 Orchard 代码生成的模块和部件不会在其驱动程序类中调用编辑器方法,因此不会加载显示部件属性的编辑器模板视图。它也不会写入模块创建的自定义数据库表,但它允许保存并创建关联的内容项。

作为项目的模块在visual studio中构建,我可以调试驱动程序的构造函数方法,但它不会命中Editor()或Display()或Editor()回发。

我使用 codegen 和代码生成扩展模块构建了一个 Orchard 模块。codegen 部分来自代码生成扩展模块,其余部分来自核心代码生成模块。我创建了模块,添加了带有属性的内容部分并生成了数据迁移。

以下是我使用的命令:

codegen module "TestModule.Foo"
codegen part "TestModule.Foo" Bar /Properties:Description:string,Broken:bool
codegen datamigration "TestModule.Foo"

我所做的唯一代码更改是通过迁移更新使类型 creatable()。我确认这已运行,并且我可以在管理员中看到用于创建新条形记录的内容类型选项。我还手动编辑了placement.info 文件以添加Parts_Bar_Edit 形状的放置标签。

这是正在使用的所有代码:

迁移.cs:

    使用 System.Data;
    使用 Orchard.ContentManagement.MetaData;
    使用 Orchard.Core.Contents.Extensions;
    使用 Orchard.Data.Migration;

    命名空间 TestModule.Foo {
        公共类迁移:DataMigrationImpl {

            公共int创建(){
                // 创建表 BarRecord
                SchemaBuilder.CreateTable("BarRecord", table => table
                    .ContentPartRecord()
                    .Column("描述", DbType.String)
                    .Column("破碎", DbType.Boolean)
                );



                返回 1;
            }
            公共 int UpdateFrom1() {                      

    ContentDefinitionManager.AlterTypeDefinition("BarRecord", cfg => cfg
                                .Creatable()

                        );
                        返回 2;           
            }
        }
    }

安置信息:

    <放置>
        <Place Parts_Bar="Content:5"/>
        <Place Parts_Bar_Edit="Content:7.5" />
    </放置>

型号/Bar.cs:

    使用果园;
    使用 Orchard.ContentManagement;

    命名空间 TestModule.Foo.Models {

        公共类栏:ContentPart {
            公共字符串描述{
                得到{返回记录。描述;}
                设置 { Record.Description = 值;}
            }
            公共布尔破碎{
                得到{返回记录。破碎;}
                设置 { Record.Broken = value; }
            }

        }
    }

模型/BarRecord.cs

    使用果园;
    使用 Orchard.ContentManagement.Records;

    命名空间 TestModule.Foo.Models {

        公共类 BarRecord : ContentPartRecord {
            公共虚拟字符串描述{get; 放; }
            公共虚拟布尔破碎{得到; 放; }

        }
    }

处理程序/BarHandler.cs

    使用 JetBrains.Annotations;
    使用 Orchard.ContentManagement.Handlers;
    使用果园。数据;
    使用 TestModule.Foo.Models;

    命名空间 TestModule.Foo.Handlers
    {
        [隐式使用]

        公共类 BarHandler : ContentHandler
        {
            公共 BarHandler(IRepository 存储库)
            {
                Filters.Add(StorageFilter.For(repository));

            }
        }
    }

驱动程序/BarDrivers.cs

    使用 JetBrains.Annotations;
    使用 Orchard.ContentManagement;
    使用 Orchard.ContentManagement.Drivers;
    使用 Orchard.Localization;
    使用 Orchard.UI.Notify;
    使用 TestModule.Foo.Models;

    命名空间 TestModule.Foo.Drivers
    {
        [隐式使用]

        公共类 BarDriver : ContentPartDriver
        {
            私有只读 INotifier _notifier;
            private const string TemplateName = "Parts/Bar";

            公共定位器 T { 获取;放; }

            公共 BarDriver(INotifier 通知程序)
            {
                _notifier = 通知器;
                T = NullLocalizer.Instance;
            }

            protected override DriverResult Display(Bar part, string displayType, dynamic shapeHelper)
            {
                return ContentShape("Parts_Bar",
                    () => shapeHelper.Parts_Bar(ContentItem: part.ContentItem));
            }

            protected override DriverResult Editor(Bar part, dynamic shapeHelper)
            {
                return ContentShape("Parts_Bar",
                        () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model:part, Prefix: Prefix));`
            }

    protected override DriverResult Editor(Bar part, IUpdateModel updater, dynamic shapeHelper)
            {
                if (updater.TryUpdateModel(part, Prefix, null, null))
                {
                    _notifier.Information(T("栏编辑成功"));
                }
                别的
                {
                    _notifier.Error(T("柱状图更新出错!"));
                }
                返回编辑器(部分,shapeHelper);
            }

        }
    }

视图/EditorTemplates/Parts/Bar.cshtml

    @model TestModule.Foo.Models.Bar
    @使用果园。内容管理;

    @{ Layout.Title = T("编辑栏").ToString(); }

    <字段集>
        <legend>@T("条形设置")</legend>
            <div>
                @Html.LabelFor(m => m.Description, @T("Description"))
                @Html.EditorFor(m => m.Description)
                @Html.ValidationMessageFor(m => m.Description, "*")
            </div>
            <div>
                @Html.LabelFor(m => m.Broken, @T("Broken"))
                @Html.EditorFor(m => m.Broken)
                @Html.ValidationMessageFor(m => m.Broken, "*")
            </div>

    </fieldset>

视图/零件/Bar.cshtml

    @model 动态

我正在使用 Orchard 1.6.1,并且能够在 1.7rc 上复制相同的行为。在这一点上,我完全被难住和沮丧,所以任何帮助将不胜感激。谢谢。

4

1 回答 1

0

一些东西...

酒吧.cs

    public class Bar : ContentPart<BarRecord> {

酒吧处理程序.cs

public BarHandler(IRepository<BarRecord> repository)

在您的迁移部分,我认为您可能想要做的是改变部分。所以它会更像这样:

public int UpdateFrom1() {                      

ContentDefinitionManager.AlterPartDefinition("Bar", cfg => cfg
                            .Attachable()
                    );
                    return 2;           
        }

您正在做的是创建一个名为 BarRecord 的类型并使其可创建,而不是实际将部件附加到它。或者让那部分被附加。因此,如果您想要 Bar 类型,也可以像以前一样:

public int UpdateFrom1() {             

ContentDefinitionManager.AlterPartDefinition("Bar", cfg => cfg
                            .Attachable()
                    );

ContentDefinitionManager.AlterTypeDefinition("BarType", cfg => cfg
                            .Creatable()
                            .WithPart("Bar")

                    );
                    return 2;           
        }

模型和处理程序中的内容应该由代码生成为您完成。所以这有点奇怪。也许您需要遵守命名约定并将 Part 添加到末尾。所以“BarPart”而不是“Bar”。或者您的模块名称周围有“”。我不知道。如果您无法使其工作,请联系该模块的作者。他是个顶级人物

于 2013-07-17T21:20:29.660 回答