Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止不可见asp.net面板中的数据绑定_Asp.net_Data Binding - Fatal编程技术网

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

防止不可见asp.net面板中的数据绑定,asp.net,data-binding,Asp.net,Data Binding,隐藏(visible=“false”)面板不会呈现,但会对包含的元素执行数据绑定。为什么要这样做?更重要的是,如何避免它 下面是一个令人讨厌的例子: <asp:Panel ID="UserPanel" runat="server" visible="<%# SelectedUser != null %>"> <%# SelectedUser.Name %> </asp:Panel> 如果SelectedUser为null,则不会呈现面

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

下面是一个令人讨厌的例子:

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

如果
SelectedUser
null
,则不会呈现面板,但会计算
SelectedUser.Name
,并生成错误

我显然可以写
,但这会增加混乱

当我知道面板中不需要数据绑定时,有没有一种方法可以简单而优雅地防止数据绑定


面板
控件在这里并不重要,它可能是带有
runat=“server”

的普通HTML元素的占位符,我可能会在这方面迟到,但我也觉得这很烦人

如果我正在呈现一个项目列表,其中每个项目可能是一个不同的类,那么我经常需要这样做——在这种情况下,数据绑定表达式中的属性将在用于其他类类型的不可见部分中给出错误。你会知道你是否想要这个

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

解决方案是简单地替代标准占位符控件,以在Visible为false时抑制绑定子控件:

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

这是一个很好的解决方案。添加
DataPlaceHolder
s不是一个昂贵的代价,所有内容都保持可读性。不过,我希望该类使用另一个名称。如何停止双向绑定?(项目)。如果我在这个DataPlcaeHolder中放置一个visible=false的文本框。在更新方法之后,它仍然得到bind并得到null值。这是一个非常好的解决方案,它帮助我通过大量控件加快了项目的速度,其中许多控件定义了与数据绑定相关的事件,并且在pageload上只有少数控件可见。一个注意点(基于我的经验):可见属性取决于父控件的可见属性。因此,如果DataPlaceHolder控件的Visible的绑定表达式计算为
true
,但它的父控件为
Visible=false
,那么DataPlaceHolder.Visible将为
false
。所以首先设置。对
true
可见,然后是DataBind();相反,你会得到错误的结果。