焊接具有ContentField的ContentPart

时间:2014-05-23 12:33:12

标签: orchardcms

我正在尝试焊接包含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());
}

我非常感谢任何指导。

2 个答案:

答案 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"));

源代码中有很多例子

最佳