【问题标题】:Custom part properties missing in export Orchard 1.6导出 Orchard 1.6 中缺少自定义部件属性
【发布时间】:2013-02-15 09:12:33
【问题描述】:

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

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

特定导出模块的module.txt是:
名称:Import Export
路径:导入导出
防伪:启用
作者:果园队
网址:http://orchardproject.net
版本:1.6
果园版本:1.4
说明:提供内容项数据导入和导出功能。
FeatureDescription:导入和导出内容项数据
分类:内容

提前致谢:)

【问题讨论】:

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


    【解决方案1】:

    您需要覆盖内容部分驱动程序中的导出/导入方法。这是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 中还有一些其他用法示例。

    【讨论】:

    • 谢谢@mdm。这完美无缺,正是我所需要的
    【解决方案2】:

    你可以尝试使用反射:

            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);
                }
            }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-19
      • 2019-03-04
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 2021-04-25
      • 2018-07-19
      • 2019-10-02
      相关资源
      最近更新 更多