如果存在,我已经创建了一些Razor代码来将图像输出到页面上。它在下面详细说明,并包含一些简单的检查以防止呈现空白列表项。该网站已经上线,工作正常。客户端然后从Umbraco中的媒体文件夹中删除了图像,这意味着我的节点分配了有效图像,但图像不存在。我得到以下例外:
'string'不包含'crop'的定义
我该如何处理?
@using umbraco.MacroEngines;
@inherits umbraco.MacroEngines.DynamicNodeContext
@using umbraco.presentation.nodeFactory
@using umbraco.cms.businesslogic.media
<ul>
@foreach (dynamic client in @Model.Children)
{
var image = Model.MediaById(client.Logo);
var crops = image.imageCropper.crops;
<li>
<h2><span>@client.Name</span></h2>
@if (crops != null || crops.GetType().ToString() != "System.String")
{
<span class="itemImage">
<img src="@crops.Find("@name", "cropname").url" alt="@client.Name" />
</span>
}
</li>
}
</ul>
答案 0 :(得分:0)
在这种情况下,您可能需要进行类型检查。我相信MediaById方法应该返回一个DynamicNode,如果它是有效的,那么类似下面的东西应该有效:
if(image.GetType() == typeof(DynamicNode))
{
...
}
答案 1 :(得分:0)
我遇到了这个问题。我发现如果媒体被删除(并且过去已被选中),Model.MediaById(imageid)调用将抛出异常。
所以我按照这样设置我的测试:
dynamic mainMediaImage = new DynamicNull();
try
{
mainMediaImage = Model.MediaById(related.eventMainImage);
}
catch(Exception e)
{
<p style='display: none;'>@e.Message</p>
}
var cropUrl = "";
if(mainMediaImage.GetType() == typeof(DynamicMedia))
{
cropUrl = GetImageCropperUrl(Model.MediaById(related.eventMainImage).crops, "List Image");
}
我仍然收到错误,但它没有显示给用户。
我发现它永远不会进入我的DynamicMedia检查,所以我不得不在调用周围添加try ... catch(),否则整个Macro都会失败。