我在新闻窗口小部件中添加了一个名为 RelatedImage 的自定义字段,我想在自定义新闻列表MVC模板中显示该字段。
注意:自定义字段是相关媒体(图像,视频,文件)字段,其限制为“可以上载或选择多个图像”设置。
我可以通过循环自定义字段来检索图像的URL,如下所示:
@item.Fields.RelatedImage.Length
以上代码适用并呈现URL。
这样的代码输出正确的值:
@item.Fields.RelatedImage
但是,当您将限制设置为“只能上载或选择1个图像”时,用于@item.RelatedItem("RelatedImage").Fields.MediaUrl
的模型会发生变化,因此上述代码会抛出异常,因为这些属性不存在。
我需要的是在列表中每个新闻项只渲染一个图像,但当我切换到“仅1图像...”限制模式时,我无法弄清楚模型的外观或如何掌握其属性。所以下面的代码不起作用:
GetType().ToString()
所以现在我的问题是令人沮丧的:我如何知道传递给我的模板/视图的模型?我已经尝试输出各种<img src="@Html.Raw(item.Fields.RelatedImage.Fields.MediaUrl)" />
选项,但我反复得到的是ItemViewModel,它没有帮助!
编辑 - 以下代码确实有效:
test()
但这令人沮丧地难以弄明白。如何找出Type RelatedImage是什么。属性Fields属于dynamic类型,这使得事情变得更加棘手。
答案 0 :(得分:2)
如果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对象。