2014-01-21 26 views
4

隱藏(visible="false")面板未呈現,但數據綁定在包含的元素上執行。爲什麼這樣做?更重要的是,如何避免它?防止隱藏asp.net面板中的數據綁定

下面是一個例子,其中它是煩人:

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

如果SelectedUsernull,面板不渲染,但SelectedUser.Name進行評價並生成錯誤。

我明顯可以寫<%# SelectedUser != null ? SelectedUser.Name : "" %>,但它增加了混亂。

當我知道不需要時,是否有方法可以簡單且優雅地防止面板內的數據綁定?

Panel控制在這裏並不重要,它可能是一個簡單的HTML元素的佔位符,它帶有runat="server"

回答

7

我可能會遲到這一點,但我也覺得這很煩人。

我經常需要這個,如果我正在渲染一個項目列表,其中每個項目可能是一個不同的類別 - 在這種情況下,數據綁定表達式中的屬性會給出其他類類型的不可見部分中的錯誤。你會知道你是否想要這個。

我已經找到了最好的解決方案是這裏描述:

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

的解決方案是標準的佔位符控件的一個簡單的覆蓋,以抑制綁定子控件是否可見是假的:

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

這是一個很好的解決方案。添加'DataPlaceHolder'不是一個高昂的代價,所有東西都是可讀的。儘管如此,我寧願選擇另一個名字。 – Mart

+0

如何停止雙向綁定? (BindItem)。如果我把這個DataPlcaeHolder中的文本框放在visible = false的位置。在更新方法中,它仍然獲得綁定並獲得值null。 – Yiping

+0

非常好的解決方案。 –