Проблема с ответом @Robin Day заключается в том, что следующий код завершается ошибкой, если у вас есть дочерние элементы с привязкой к данным, которые могут иметь или не иметь данные с учетом текущего состояния того, что вы отображаете. Иногда бывает сложно маневрировать вокруг обнуляемого кода, связанного с данными, если у вас есть сложный граф объектов.
Например, рассмотрим:
<asp:PlaceHolder runat="server" Visible="<%# VisibleCondition() %>">
<%# ((string)null).ToString("c") %> //an object that may have null data
//given the visible condition
</asp:PlaceHolder>
Если VisibleCondition()
возвращает false
, дочерние элементы управления по-прежнему вызываются с DataBind()
, что может привести к NullReferenceException
в примере выше.
Вот лучший подход, ИМХО:
public class ConditionalPlaceHolder : PlaceHolder
{
protected override void DataBindChildren()
{
if( this.Visible )
{
base.DataBindChildren();
}
}
}
И используется следующим образом:
<web:ConditionalPlaceHolder runat="server" Visible="<%# VisibleCondition1() %>">
//whatever databound code
<%# ((string)notNullGivenVisibleCondition1).ToString() %>
<p>But could be given visible condition 2</p>
</web:ConditionalPlaceHolder>
<web:ConditionalPlaceHolder runat="server" Visible="<%# VisibleCondition2() %>">
//whatever databound code
<%# ((string)notNullGivenVisibleCondition2).ToString() %>
<p>But could be given visible condition 1</p>
</web:ConditionalPlaceHolder>