所以我使用内容选择器显示所选项目的列表,默认情况下,输出显示如下:
推荐:查看,查看
但我希望它实际显示ContentItem的各个部分。这是遍历项目的代码:
@using Orchard.ContentPicker.Fields
@using Orchard.Utility.Extensions;
@{
var field = (ContentPickerField) Model.ContentField;
string name = field.DisplayName;
var contentItems = field.ContentItems;
}
<p class="content-picker-field content-picker-field-@name.HtmlClassify()">
<span class="name">@name:</span>
@if(contentItems.Any()) {
foreach(var contentItem in contentItems) {
<span class="value"> @Html.ItemDisplayLink(contentItem)</span>
if(contentItem != contentItems.Last()) {
<span>,</span>
}
}
}
else {
<span class="value">@T("No content items.")</span>
}
</p>
我尝试了几种不同的方式来访问数据,但通常最后会收到警告,说明它不包含引用,或者它无法将其转换为字符串。
我知道在这些项目的实际页面上,它们位于Model.ContentPart.Quote.Value
修改 我认为我遇到的问题是我在主页上,我不能去Models.Content.Quote或任何类似的访问数据,因为它没有列在这个页面上。列出的每个报价的唯一数据是ID。
答案 0 :(得分:1)
只需将var
更改为dynamic
中的foreach
。
因此,你改变了这个:
foreach(var contentItem in contentItems) {
<span class="value"> @Html.ItemDisplayLink(contentItem)</span>
if(contentItem != contentItems.Last()) {
<span>,</span>
}
}
到此:
foreach(dynamic contentItem in contentItems) {
<span class="value"> @Html.ItemDisplayLink(contentItem)</span>
if(contentItem != contentItems.Last()) {
<span>,</span>
}
}
然后你可以访问contentItem
内的任何部分,如下所示:
contentItem.ZenGalleryPart.Path
foreach(dynamic contentItem in contentItems) {
<span class="value"> @Html.ItemDisplayLink(contentItem)</span>
<span class="value"> @T(contentItem.ZenGalleryPart.Path)</span>
if(contentItem != contentItems.Last()) {
<span>,</span>
}
}
答案 1 :(得分:0)
在以下示例中,我有一个ContentType 运动员,它使用ContentPickerField选择ContentType 团队
在我为运动员创建的摘要视图中,我可以使用以下代码访问使用ContentPickerField选择的团队中的所有部分和字段。
内容-Athlete.Summary.cshtml 强>
@using Orchard.Utility.Extensions;
@using Orchard.ContentPicker.Fields
@{
var teamField = (ContentPickerField) Model.ContentItem.Athlete.Team;
//make sure your var is cast (dynamic) and you will have access to all parts/fields
var team = (dynamic)teamField.ContentItems.First();
}
@team.TeamPart.City.Value
答案 2 :(得分:0)
您基本上需要的是转换内容项(在内容选择器中选择)到形状,以避免跳过shape alternates等重要方面。
幸运的是BuildDisplay()
在视图中可用,因此您只需编写
foreach (var contentItem in contentItems)
{
@Display(BuildDisplay(contentItem))
}
而BuildDisplay()
会为contentItem
创建一个形状,Display()
会渲染形状。
如果您需要contentItem
部分的特定输出,那么您应该创建一个合适的形状替代。