2012-05-10 60 views
3

我創建了一些Razor代碼來將圖像輸出到頁面上(如果存在)。它在下面詳細介紹,幷包含一些簡單的檢查以防止呈現空白列表項。該網站已上線並正常運行。然後,客戶端從Umbraco中的媒體文件夾中刪除了圖像,這意味着我的節點分配了有效的圖像,但圖像不存在。我有以下異常:使用Umbraco中的Razor測試圖像作物存在

「串」不包含定義「莊稼」

如何面對呢?

@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

在這種情況下,您可能需要進行類型檢查。我相信MediaById方法應該返回一個DynamicNode如果它是有效的,所以像下面應該工作:

if(image.GetType() == typeof(DynamicNode)) 
{ 
    ... 
} 
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()或者對整個宏添加失敗。