在Umbraco用Razor测试图像作物的存在

时间:2012-05-10 20:08:01

标签: image umbraco

如果存在,我已经创建了一些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>

2 个答案:

答案 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都会失败。