我正在使用形状跟踪器,以便使用名为location的某个分类字段的备用视图。但是,与其他形状不同,在此案例摘要或详细信息中,替代品不提供不同显示类型的选项。因此,通过更改1,您可以更改另一个。我需要能够独立完成它们。
我创建了一个视图,请参阅下面的 Fields.Contrib.TaxonomyField-Location.cshtml ,但正如我所说,如果显示类型是详细信息或摘要,则显示相同。
如何克服这一点。
感谢Jon
答案 0 :(得分:4)
I had the same problem not long ago。您可以通过实施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-Summary
或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();
});
}
}