Orchardcms 导入/导出自定义站点设置部件上未调用的方法

Orchardcms 导入/导出自定义站点设置部件上未调用的方法,orchardcms,Orchardcms,我已经创建了一个自定义零件并将其附加到网站内容类型。在自定义零件的驱动程序中,我覆盖了导入和导出方法,但当我在调试时执行导出或导入时,它们永远不会被调用 我的零件有两个布尔属性和一个复杂类型。当我检查get生成的导出文件时,我的bool属性存在,但我的复杂类型不存在,因此看起来Orchard正在自动处理简单类型 知道为什么我的导入和导出方法没有被调用吗 更新: 经过更多的调试,我想我明白了为什么我的复杂类型没有被导出。在的ExportSiteSettings方法中,对属性类型(第151行)进行了

我已经创建了一个自定义零件并将其附加到网站内容类型。在自定义零件的驱动程序中,我覆盖了导入和导出方法,但当我在调试时执行导出或导入时,它们永远不会被调用

我的零件有两个布尔属性和一个复杂类型。当我检查get生成的导出文件时,我的bool属性存在,但我的复杂类型不存在,因此看起来Orchard正在自动处理简单类型

知道为什么我的导入和导出方法没有被调用吗

更新: 经过更多的调试,我想我明白了为什么我的复杂类型没有被导出。在的ExportSiteSettings方法中,对属性类型(第151行)进行了显式检查,只有string、bool和int类型的属性的值包含在导出的site settings部分中。据我所知,我的驱动程序从未参与导出站点设置

如果我选择站点类型和数据作为导出选项,我的驱动程序的导出方法会被调用,属性包含在导出文件的数据部分,但当我转到导入时,它们会被忽略,并且我的驱动程序的导入方法永远不会被调用(我想这是因为数据下的站点元素没有Id属性集)

我不知道该怎么办。网站内容类型是否不支持导出复杂类型

以下是我的代码:

public class ProductSettingsPart : ContentPart {

        public bool DefineSiteDefaults {
            get { return this.Retrieve(p => p.DefineSiteDefaults); }
            set { this.Store(p => p.DefineSiteDefaults, value); }
        }

        public bool AllowProductOverrides {
            get { return this.Retrieve(p => p.AllowProductOverrides); }
            set { this.Store(p => p.AllowProductOverrides, value); }
        }

        public IEnumerable<PriceTier> PriceTiers {
            get {
                var rawTiers = Retrieve<string>("PriceTiers");
                return PriceTier.DeserializePriceTiers(rawTiers);
            }
            set {
                var serializedTiers = PriceTier.SerializePriceTiers(value);
                Store("PriceTiers", serializedTiers ?? "");
            }
        }
    }
公共类产品设置spart:ContentPart{
公共布尔定义的结果{
获取{返回this.Retrieve(p=>p.DefineSiteDefaults);}
设置{this.Store(p=>p.DefineSiteDefaults,value);}
}
公共布尔允许产品覆盖{
获取{返回this.Retrieve(p=>p.AllowProductOverrides);}
设置{this.Store(p=>p.AllowProductOverrides,value);}
}
公共可数价格层{
得到{
var rawTiers=检索(“价格层”);
返回PriceTier。反序列化PriceTiers(rawTiers);
}
设置{
var serializedTiers=PriceTier.serializedPriceTiers(值);
商店(“PriceTiers”,serializedTiers??);
}
}
}

我也遇到了同样的问题,我需要导出SearchSettingsPart的SearchedFields属性,一个
字符串[]

我修复了这个问题并提交了一个请求

有一种方便的方法可以导出bool/int/string字段 您现在应该能够使用零件驱动程序的导入导出方法

protected override void Exporting(SearchSettingsPart part, ExportContentContext context) {
    DefaultSettingsPartImportExport.ExportSettingsPart(part, context);
    context.Element(part.PartDefinition.Name).Add(new XAttribute("SearchedFields", string.Join(",", part.SearchedFields)));
}

protected override void Importing(SearchSettingsPart part, ImportContentContext context) {
    var xElement = context.Data.Element(part.PartDefinition.Name);
    if (xElement == null) return;

    DefaultSettingsPartImportExport.ImportSettingPart(part, xElement);

    var searchedFields = xElement.Attribute("SearchedFields");
    part.SearchedFields = searchedFields.Value.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries);
}

我很困惑,因为如果这两个布尔在导出文件中,那么会调用导出。您是否对bool属性使用信息集存储?附加一个调试器,找出它失败的地方。@Piedone-是的,我对我的所有属性都使用信息集存储。@Bertrand-我更新了我的问题,提供了一些关于我在进一步调试后发现的内容的更多信息。我认为这是一个错误。请归档。该修补程序刚刚应用于1.7.x分支。