【问题标题】: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.CommonPartDriver、Orchard.Users.Drivers.UserPartDriver 和 Orchard.Comments.Drivers.CommentPartDriver 中还有一些其他用法示例。
【解决方案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);
}
}
您可能需要做一些额外的工作才能使其支持枚举等。
这可能应该在某种帮助类中。