2013-07-24 34 views
1

爲什麼呈現佔位符內的內容? 此代碼導致:「對象引用未設置爲對象的實例。」 對於MainGuard對象!爲什麼呈現隱藏的asp:PlaceHolder內的內容?

應該如何處理這種情況?

<asp:PlaceHolder runat="server" Visible="<%# Model.MainGuard != null %>"> 
    <asp:Image runat="server" ImageUrl="<%# Model.MainGuard.Image.RenderImage() %>" Height="50" /> 
    <%# Model.MainGuard.Name %> 
</asp:PlaceHolder> 

回答

1

這不是渲染 - 但它仍必須是運行時解析,因此你仍然得到例外。你唯一的辦法是檢查空每次:

<asp:Image runat="server" 
    ImageUrl="<%# Model.MainGuard == null ? "" : Model.MainGuard.Image.RenderImage() %>" /> 
<%# Model.MainGuard == null ? "" : Model.MainGuard.Name %> 

您可以考慮使用擴展方法,允許更清晰的語法:

public static string StringOrEmpty(this MyClass self, Func<MyClass, string> selector) 
{ 
    if (self == null) return ""; 

    return selector(self); 
} 

然後,你可以寫:

<asp:Image runat="server" 
    ImageUrl="<%# Model.MainGuard.StringOrEmpty(mainGuard => mainGuard.Image.RenderImage()) %>" /> 
<%# Model.MainGuard.StringOrEmpty(mainGuard => mainGuard.Name) %> 
+0

好 - 我覺得奇怪的是沒有更清潔的方式..但是,謝謝 - 擴展方法使它可以接受.. –

+1

我將它改爲了一個泛型:'public static string StringOrEmpty (this T self,Func selector)where T:new()' –