在不可见的asp.net面板中阻止数据绑定

时间:2014-01-21 14:44:41

标签: asp.net data-binding

不呈现隐藏(visible="false")面板,但是对包含的元素执行数据绑定。为什么这样做?更重要的是,如何避免它?

以下是令人讨厌的例子:

<asp:Panel ID="UserPanel" runat="server" visible="<%# SelectedUser != null %>">
    <%# SelectedUser.Name %>
</asp:Panel>

如果SelectedUsernull,则不会呈现该面板,但会评估SelectedUser.Name并生成错误。

我显然可以写<%# SelectedUser != null ? SelectedUser.Name : "" %>,但它会增加混乱。

当我知道不需要数据绑定时,有没有办法简单而优雅地阻止数据绑定?

此处Panel控件并不重要,它可能是runat="server"的纯HTML元素的占位符。

1 个答案:

答案 0 :(得分:10)

我可能会迟到这一点,但我也觉得这很烦人。

如果我渲染的项目列表中每个项目可能是不同的类,我经常需要这个 - 在这种情况下,数据绑定表达式中的属性将在其他类类型的不可见部分中给出错误。你会知道你是否想要这个。

我找到的最佳解决方案如下所述:

http://hermanussen.eu/sitecore/wordpress/2011/04/prevent-nullrefs-when-databinding-with-placeholders/

如果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(); 
            } 
        } 
    } 
}