导出Orchard 1.6中缺少自定义零件属性

时间:2013-02-15 09:12:34

标签: asp.net-mvc orchardcms orchardcms-1.6

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

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

特定导出模块的module.txt为:
名称:进口出口
路径:ImportExport
AntiForgery:启用
作者:果园团队
网站:http://orchardproject.net
版本:1.6
OrchardVersion:1.4
描述:提供内容项数据导入和导出功能 FeatureDescription:导入和导出内容项数据
类别:内容

提前致谢:)

2 个答案:

答案 0 :(得分:7)

您需要覆盖内容部件驱动程序中的导出/导入方法。以下是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.CommonPartDriverOrchard.Users.Drivers.UserPartDriverOrchard.Comments.Drivers.CommentPartDriver中还有其他一些使用示例。

答案 1 :(得分: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等。 这应该是某种帮助类。