我正在尝试焊接包含TaxonomyField类型的ContentField的自定义ContentPart SitesPart
,但它不适用于我。当我从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());
}
我非常感谢任何指导。
答案 0 :(得分:1)
哦,你是完全正确的,零件是焊接的,但如果有一些内容领域,它们不会被焊接。 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);
}
}
最佳
答案 1 :(得分:0)
要将内容部分动态附加到内容类型,您可以在处理程序中使用它
Filters.Add(new ActivatingFilter<YourContentPart>("YourContentType"));
源代码中有很多例子
最佳