2

我正在使用形状跟踪器,以便使用我的一个分类字段的替代视图,称为位置。然而,与其他形状不同,在这种情况下,替代品不提供不同显示类型的选项摘要或详细信息。因此,通过更改 1,您可以更改另一个。我需要能够独立完成它们。

我创建了一个视图,请参见Fields.Contrib.TaxonomyField-Location.cshtml,但正如我所说,如果显示类型是详细信息或摘要,则呈现相同的视图。

请问我该如何克服这个问题。

谢谢乔恩

4

1 回答 1

4

不久前我遇到了同样的问题ShapeDisplayEvents你可以通过实现一个类来提供你自己的替代品。

这是一个实现,它根据内容类型、显示类型或两者为您提供替代方案:

public class PartContentTypeAlternateFactory : ShapeDisplayEvents {
    public override void Displaying(ShapeDisplayingContext context) {
        context.ShapeMetadata.OnDisplaying(displayedContext => {
            var shapeType = displayedContext.ShapeMetadata.Type;
            var contentItem = displayedContext.Shape.ContentItem;
            var displayType = displayedContext.ShapeMetadata.DisplayType;
            var contentType = contentItem.ContentType;
            displayedContext.ShapeMetadata.Alternates.Add(
                String.Format("{0}__{1}", shapeType, displayType));
            displayedContext.ShapeMetadata.Alternates.Add(
                String.Format("{0}__{1}__{2}", shapeType, (string)contentType, displayType));
            });
    }
}

您最终会在形状跟踪器中出现一些额外的替代项,如下所示:

在此处输入图像描述

你现在可以使用一个名为Fields.Contrib.TaxonomyField-Location-Summaryor的替代品Fields.Contrib.TaxonomyField-Location-Detail。你可以扩展这个类来添加你想要的任何替代品。

编辑

我没有意识到你不能轻易地获得字段名称,所以尝试这样的事情 - 它做的事情类似于所做的事情UrlAlternatesFactory,即它循环现有的替代品并将 displayType 添加到它们。这应该为您提供一个包含字段名称和显示类型的替代项。

public class PartContentTypeAlternateFactory : ShapeDisplayEvents {
    public override void Displaying(ShapeDisplayingContext context) {
        context.ShapeMetadata.OnDisplaying(displayedContext => {
            var alternates = displayedContext.ShapeMetadata.Alternates.Select(a => a + "__" + displayedContext.ShapeMetadata.DisplayType);
            displayedContext.ShapeMetadata.Alternates = displayedContext.ShapeMetadata.Alternates.Union(alternates).ToList();
        });
    }
}
于 2013-02-05T12:58:28.340 回答