6

我在 Orchard 1.6 中的导入导出模块有问题:
我想导出一个自定义类型,其中包含一个具有属性的部分。导出的 XML 包含来自 TitlePart、CommonPart、BodyPart 和 AutoroutePart 的数据,但是我自己的部分的数据不存在。

有什么我应该做的,比如实现一个接口或覆盖我的某些东西,以便它包含在导出 XML 中?导出模块的扩展点是什么(如果有的话)?我有模块的来源,但找不到。

特定导出模块的 module.txt 为:
名称:Import 导出
路径:ImportExport
AntiForgery:启用
作者:The Orchard Team
网站:http
://orchardproject.net 版本:1.6
OrchardVersion:1.4
描述:提供内容项数据导入和导出能力。
FeatureDescription:导入和导出内容项数据
类别:内容

提前致谢 :)

4

2 回答 2

8

您需要覆盖内容部分驱动程序中的导出/导入方法。这是一个简单的例子Orchard.Core.Title.Driver.TitlePartDriver

protected override void Importing(TitlePart part, ImportContentContext context) {
    var title = context.Attribute(part.PartDefinition.Name, "Title");
    if (title != null) {
        part.Title = title;
    }
}

protected override void Exporting(TitlePart part, ExportContentContext context) {
    context.Element(part.PartDefinition.Name).SetAttributeValue("Title", part.Title);
}

该类ImportExportContext提供对用于生成输出文档的底层 XML 结构的访问,因此如果您习惯于使用 System.Xml.Linq、XDocument 等,那么它看起来都很熟悉。

Orchard.Core.Common.Drivers.CommonPartDriver在、Orchard.Users.Drivers.UserPartDriver和中还有其他一些用法示例Orchard.Comments.Drivers.CommentPartDriver

于 2013-02-15T10:32:33.340 回答
0

您可以尝试使用反射:

        string[] notRequiredExportProperties = new string[] 
            {
                "Record", 
                "ContentItem", 
                "Zones", 
                "Id", 
                "TypeDefinition", 
                "TypePartDefinition",
                "PartDefinition", 
                "Settings", 
                "Fields"
            };

        protected override void Importing(ContactPart part, Orchard.ContentManagement.Handlers.ImportContentContext context)
        {
            var contactRecordType = part.Record.GetType();
            var allProps = contactRecordType.GetProperties();
            foreach (PropertyInfo p in allProps)
            {
                if (Array.FindIndex(notRequiredExportProperties, i => i == p.Name) > -1)
                    continue;

                var importValue = context.Attribute(part.PartDefinition.Name, p.Name);
                var import = Convert.ChangeType(importValue, p.PropertyType);
                if (p.PropertyType.IsSubclassOf(typeof(Enum)))
                    continue;
                p.SetValue(part.Record, import, null);
            }
        }

        protected override void Exporting(ContactPart part, Orchard.ContentManagement.Handlers.ExportContentContext context)
        {
            var contactPartType = part.GetType();
            var allProps = contactPartType.GetProperties();
            foreach(PropertyInfo p in allProps)
            {
                if (Array.FindIndex(notRequiredExportProperties, i => i == p.Name) > -1)
                    continue;

                var propVal = p.GetValue(part, null);
                context.Element(part.PartDefinition.Name).SetAttributeValue(p.Name, propVal);
            }
        }

您可能需要做一些额外的工作才能使其支持 Enums 等。这可能应该在某种辅助类中。

于 2015-01-20T16:11:40.430 回答