不呈现隐藏(visible="false"
)面板,但是对包含的元素执行数据绑定。为什么这样做?更重要的是,如何避免它?
以下是令人讨厌的例子:
<asp:Panel ID="UserPanel" runat="server" visible="<%# SelectedUser != null %>">
<%# SelectedUser.Name %>
</asp:Panel>
如果SelectedUser
为null
,则不会呈现该面板,但会评估SelectedUser.Name
并生成错误。
我显然可以写<%# SelectedUser != null ? SelectedUser.Name : "" %>
,但它会增加混乱。
当我知道不需要数据绑定时,有没有办法简单而优雅地阻止数据绑定?
此处Panel
控件并不重要,它可能是runat="server"
的纯HTML元素的占位符。
答案 0 :(得分:10)
我可能会迟到这一点,但我也觉得这很烦人。
如果我渲染的项目列表中每个项目可能是不同的类,我经常需要这个 - 在这种情况下,数据绑定表达式中的属性将在其他类类型的不可见部分中给出错误。你会知道你是否想要这个。
我找到的最佳解决方案如下所述:
如果Visible为false,解决方案是标准PlaceHolder控件的简单覆盖,以禁止绑定子控件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
namespace Website.Controls
{
public class DataPlaceHolder : PlaceHolder
{
protected override void DataBindChildren()
{
if (Visible)
{
base.DataBindChildren();
}
}
}
}