Orchard 1.6中的导入导出模块有问题:
我想导出一个自定义类型,其中包含一个属性的部分。导出XML包含来自TitlePart,CommonPart,BodyPart和AutoroutePart的数据,但是我自己的数据不存在。
我应该做些什么,比如实现一个接口或覆盖我的东西,以便它包含在导出XML中?什么是(如果有的话)导出模块的扩展点?我有模块的来源但找不到它。
特定导出模块的module.txt为:
名称:进口出口
路径:ImportExport
AntiForgery:启用
作者:果园团队
网站:http://orchardproject.net
版本:1.6
OrchardVersion:1.4
描述:提供内容项数据导入和导出功能
FeatureDescription:导入和导出内容项数据
类别:内容
提前致谢:)
答案 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.CommonPartDriver
,Orchard.Users.Drivers.UserPartDriver
和Orchard.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等。 这应该是某种帮助类。