未渲染一个隐藏的(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元素的占位符。
我可能迟到了,但我也觉得这很烦人。
如果我要渲染每个项目可能是不同类别的项目列表 - 在这种情况下,数据绑定表达式中的属性将在针对其他类型类型的无形部分中给出错误。你会知道你是否想要这个。
我发现的最佳解决方案在这里描述:
http://hermanussen.eu/sitecore/wordpress/2011/04/prevent-nullrefs-when-databinding-with-placeholders/
解决方案是标准占位持有人控制的简单覆盖,如果可见的是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();
}
}
}
}