Sitefinity 中单个相关图像属性使用的对象类型

本文关键字:对象 类型 属性 单个相 图像 Sitefinity | 更新日期: 2023-09-27 18:34:02

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

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

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

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

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

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

@item.Fields.RelatedImage.Length

但是,当您将限制设置为"只能上传或选择 1 张图像"时,用于@item.Fields.RelatedImage的模型会发生变化,因此上述代码会引发异常,因为这些属性不存在。

我需要的是只渲染列表中的每个新闻项一张图像,但是当我切换到"只有 1 张图像......"时......"限制模式,我无法弄清楚模型是什么样子的,或者如何掌握它的属性。因此,以下代码将不起作用:

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

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

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

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

但令人沮丧的是,这很难弄清楚。如何弄清楚类型相关图像是什么。属性字段是动态类型的,这使得事情变得更加棘手。

Sitefinity 中单个相关图像属性使用的对象类型

如果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" />
    } 
}

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

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

这将返回 Image 对象的集合,而不考虑所选的图像数量。