2016-08-12 38 views
0

Visible=false下有一個嵌套控件,爲什麼ASP.NET試圖編譯它?如果不顯示控件,爲什麼會評估其屬性?

Control.Visible Property documentation說:

如果容器控件沒有呈現,它包含 不會被渲染

我隱藏任何控件:

public MyClass myVariable = null; 

我的看法代碼是:

<asp:panel runat="server" Visible="false"> 
     <img id="imgNotConfirmedPhoto" src="<%# myVariable.Whatever %>" /> 
</asp:panel> 

它拋出異常:當試圖編譯myVariable.Whatever

對象引用不設置爲一個對象

的一個實例。爲什麼ASP.NET試圖評估圖像src如果容器有Visible=false

+1

嘗試用'風格=「顯示替換'Visible'屬性:。none' – Venky

+0

@Venky這不是問題,並不會改變任何事情 – CodeCaster

+0

@Venky,我不能代替它的代碼已被簡化爲在問題 –

回答

2

正如你可以在MSDN: ASP.NET Page Life Cycle Overview中看到的那樣,整個頁面在渲染之前就會被解析和加載。

這包括渲染後不可見的控件(例如,當他們或他們的父控件有Visible = false時)。

因此,無論是否會顯示控件,它都將被解析並加載,並且其屬性將被評估,導致您看到的異常。

+0

更清晰的代碼謝謝,@CodeCaster但是,在性能方面它不是一個壞主意嗎? –

+1

@Mario控制仍然必須因爲它可以在代碼中設置爲'Visible = true',並且因爲它可以接收或引發事件。 – CodeCaster

-1

因爲您已經在img源代碼中設置了服務器標籤。服務器標籤不特定的元素,所以無論你設置VISIBLE="FALSE"屬性,你的服務器標籤將呈現的,如果他們沒有找到的元素,將出現異常......

你可以有兩種選擇:

  1. 使用顯示:無在CSS

    <asp:panel runat="server" style="display:none;"> 
    
  2. 或設置從代碼圖像源的後面,這樣,如果該面板是可見= FALSE它不會被渲染。

+0

問題與'Visible'屬性有關,我不是在尋找替代方法,我只是要求瞭解爲什麼是這種行爲。 –

相關問題