在Orchard中访问contentpicker字段值

时间:2013-04-16 19:45:19

标签: .net orchardcms

所以我使用内容选择器显示所选项目的列表,默认情况下,输出显示如下:

  

推荐:查看,查看

但我希望它实际显示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。

3 个答案:

答案 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部分的特定输出,那么您应该创建一个合适的形状替代。