3

我已向名为RelatedImage的新闻小部件添加了一个自定义字段,我想在自定义新闻列表 MVC 模板中显示该字段。

注意:自定义字段是相关媒体(图片、视频、文件)字段,设置了“可以上传或选择多张图片”的限制。

我可以通过循环自定义字段来检索图像的 URL,如下所示:

@foreach (var relatedItem in item.Fields.RelatedImage)
{
    <li>@relatedItem.Fields.MediaUrl</li>
}  

上面的代码工作并呈现 URL。

像这样的代码输出正确的值:

@item.Fields.RelatedImage.Length

但是,当您将限制设置为“只能上传或选择 1 张图片”时,用于@item.Fields.RelatedImage更改的模型因此上述代码会抛出异常,因为这些属性不存在。

我需要的是只为列表中的每个新闻项目渲染一张图片,但是当我切换到“只有一张图片...”限制模式时,我无法弄清楚模型的外观或如何获取持有它的属性。所以下面的代码不起作用:

@item.RelatedItem("RelatedImage").Fields.MediaUrl

所以现在对我来说是一个令人沮丧的问题:我如何知道传递给我的模板/视图的模型是什么?我尝试过输出各种GetType().ToString()选项,但我反复得到的只是 ItemViewModel 这无济于事!

编辑 - 以下代码实际有效:

<img src="@Html.Raw(item.Fields.RelatedImage.Fields.MediaUrl)" />

但这令人沮丧地难以弄清楚。如何弄清楚 Type RelatedImage 是什么。属性 Fields 是动态类型的,这使事情变得更加棘手。

4

1 回答 1

3

如果该RelatedImage字段设置为允许 1 张图像,则返回的值将是 类型Telerik.Sitefinity.Libraries.Model.Image

如果该字段设置为允许多张图片,则返回的值将是一个相同类型的数组,即Telerik.Sitefinity.Libraries.Model.Image[]

要回答您的问题,您可以检查RelatedImage属性的类型:

@if (item.Fields.RelatedImage is Image)
{
    <img src="item.Fields.RelatedImage.Fields.MediaUrl" />
}
else if (item.Fields.RelatedImage is Image[])
{
    foreach (var relatedItem in item.Fields.RelatedImage)
    {
        <img src="relatedItem.Fields.MediaUrl" />
    } 
}

更好的方法可能是使用在构建视图模型时GetRelatedItems找到的扩展,例如Telerik.Sitefinity.RelatedData.RelatedDataExtensions

viewModel.RelatedImages = newsItem.GetRelatedItems<Image>("RelatedImage")

这将返回 Image 对象的集合,无论选择的图像数量如何。

于 2016-02-17T14:13:22.847 回答