我试图焊接我的自定义ContentPart SitesPart,其中包含一个TaxonomyField类型的ContentField,但它对我不起作用。当我从UI附加这个部件时,它工作得很好,我在编辑模式和显示模式下都看到了TaxonomyField。
下面是我的ContentHandler的激活方法。
protected override void Activating(ActivatingContentContext context)
{
if (context.ContentType == "Page")
{
context.Builder.Weld<SitesPart>();
}
}我试图深入研究Weld函数,发现它无法找到正确的typePartDefinition。它位于条件if (typePartDefinition == null)中,该条件创建一个没有现有ContentFields的空typePartDefinition,依此类推。
// obtain the type definition for the part
var typePartDefinition = _definition.Parts.FirstOrDefault(p => p.PartDefinition.Name == partName);
if (typePartDefinition == null) {
// If the content item's type definition does not define the part; use an empty type definition.
typePartDefinition =
new ContentTypePartDefinition(
new ContentPartDefinition(partName),
new SettingsDictionary());
}我将非常感谢您的任何指导。
发布于 2015-07-19 07:52:38
哦,你完全正确,零件是焊接的,但如果有一些内容字段,它们就不是焊接的。ContentItemBuilder尝试通过我们要在其上添加部件的内容类型定义来检索部件定义。因此,因为这是不可能的,所以创建了一个新的内容部分,但是包含一个空的ContentPartFieldDefinition集合...
我认为ContentItemBuilder需要在其构造函数中注入,并使用ContentPartDefinition或更一般的IContentDefinitionManager……但是,为了快速解决问题,我尝试了以下有效的方法
在ContentItemBuilder.cs中,替换以下内容
public ContentItemBuilder Weld<TPart>()...使用
public ContentItemBuilder Weld<TPart>(ContentPartDefinition contentPartDefinition = null)...还有这个
new ContentPartDefinition(partName),使用
contentPartDefinition ?? new ContentPartDefinition(partName),在你的部分处理程序中,注入一个IContentDefinitionManager并使用这个
protected override void Activating(ActivatingContentContext context) {
if (context.ContentType == "TypeTest") {
var contentPartDefinition = _contentDefinitionManager.GetPartDefinition(typeof(FruitPart).Name);
context.Builder.Weld<FruitPart>(contentPartDefinition);
}
}最好的
发布于 2015-04-25 10:46:28
要动态地将内容部分附加到内容类型,可以在处理程序中使用此命令
Filters.Add(new ActivatingFilter<YourContentPart>("YourContentType"));在源代码中有很多示例
最好的
https://stackoverflow.com/questions/23829385
复制相似问题