在我的Orchard网站中,有一个名为Product的内容类型。它有零件Container和Routable。产品可以包含名为ProductFeature的内容类型。
我已经覆盖了视图Content-Product.cshtml,以便在浏览到路径网址时修改html。 在此视图中,如何获取产品包含的所有ProductFeature列表?
这篇文章展示了如何为博客Widget执行此操作。 http://weblogs.asp.net/bleroy/archive/2011/03/27/taking-over-list-rendering-in-orchard.aspx
我很难在产品的内容视图中找到如何执行此操作。上面示例中的代码抛出了一个null异常错误,因此模型结构必须不同。我尝试在Visual Studio中使用Shape Tracing或调试来查看模型,但找不到包含的项目。
任何帮助都将不胜感激。
答案 0 :(得分:2)
如果您确保您的placement.info包含容器部分,那么您的功能列表应该已经显示。
答案 1 :(得分:2)
我使用了两种选择(我知道Bertrand会称他们丑陋而且不必要,因为他努力工作以给我们许多其他工具,但如果你要么没有掌握Orchard的全部美感,那么它是多么巧妙,你需要这些黑客。)
所以这里是2:
创建部分视图Parts.Container.Contained-YourContentTypeName.cshtml
内
@foreach (var p in Model.List.Items)
{
// regular content parts, Title and Body
string title = p.ContentItem.TitlePart.Title;
string body = p.ContentItem.BodyPart.Text;
// Your custome content parts
string something = p.ContentItem.YourContentPartName.YourContentPartFieldName.Value;
}
:
Content-YourContentTypeName.cshtml
在我的情况下,至少它是var yourList = Model.Content.Items[1].List.Items;
,您可以检查列表所在的模型中的形状跟踪。从这里开始,一切都与1)相同。
希望它可以帮助那些偶然发现线程的人,像我几周前那样寻找这个解决方案。
答案 2 :(得分:0)
要扩展Zoran的答案,如果您不想在Items列表中硬编码Container的位置,您可以使用LINQ:
IEnumerable<dynamic> items = Model.Content.Items;
var container = (from item in items
where (item.ContentPart.PartDefinition.Name == "ContainerPart")
select item).ElementAt(0);
...
@Display(container.List.Items)