2013-07-24 2 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

Okay - Мне просто кажется странным, что нет еще более чистого способа. Но спасибо - метод расширения делает его приемлемым. –

+1

Я изменил его на общий: 'public static string StringOrEmpty (этот T self, Func селектор), где T: new() ' –

Смежные вопросы