2016-08-12 155 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'属性有关,我不是在寻找替代方法,我只是要求了解为什么是这种行为。 –