我创建了一个自定义部件并将其附加到网站内容类型。在我的自定义部件的驱动程序中,我重写了导入和导出方法,但是当我在调试时执行导出或导入时,它们永远不会被调用。
我的部分有两个bool属性和一个复杂类型。当我检查生成的导出文件时,我的bool属性存在,但我的复杂类型不是这样,Orchard似乎自动处理简单类型。
为什么我的导入和导出方法没有被调用?
经过一些调试后,我想我明白为什么我的复杂类型没有被导出。在ImportExportService的ExportSiteSettings方法中,对属性类型进行了显式检查(第151行),并且只有string,bool和int类型的属性将其值包含在导出的站点设置部分中。据我所知,我的驱动程序从不参与导出网站设置。
如果我选择站点类型和数据作为导出选项,我的驱动程序的导出方法会被调用,并且属性包含在导出文件的数据部分中,但是当我去导入时,它们将被忽略,我的驱动程序的导入方法是从未调用过(我认为因为Data下的Site元素没有设置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 ?? "");
}
}
}
答案 0 :(得分:0)
我遇到了同样的问题,我需要导出SearchSettingsPart的SearchedFields属性string[]
。
我修复了问题并提交了拉取请求。
https://orchard.codeplex.com/SourceControl/network/forks/StanleyGoldman/Issue20404/contribution/6048
有一种方法可以导出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);
}