当控件未被渲染时,为什么要对其属性进行评估?

时间:2016-08-12 09:38:57

标签: c# asp.net

Visible=false下有一个嵌套控件,为什么ASP.NET会尝试编译它?

Control.Visible Property documentation说:

  

如果未呈现容器控件,则包含它包含的任何控件   不会被渲染

我的CodeBehind:

  public MyClass myVariable = null;

我的观看代码是:

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

它抛出异常:

  

对象引用未设置为对象的实例

尝试编译myVariable.Whatever时。如果容器具有src

,为什么ASP.NET会尝试评估图像Visible=false

2 个答案:

答案 0 :(得分:2)

正如您在MSDN: ASP.NET Page Life Cycle Overview中看到的那样,整个页面将在呈现之前很久就被解析和加载。

这包括渲染后不可见的控件(例如,当它们或它们的父控件具有Visible = false时)。

因此,无论是否呈现控件,都将对其进行解析和加载,并对其属性进行评估,从而导致您看到的异常。

答案 1 :(得分:-1)

因为您已在img源中设置了服务器标记。服务器标签不是特定于元素的,因此无论您是否设置VISIBLE="FALSE"属性,您的服务器标签都会呈现,如果它们没有找到该元素,则会发生异常......

您可以选择两个选项:

  1. 在css中使用display:none

    <asp:panel runat="server" style="display:none;">
    
  2. 或者从后面的代码设置图像源,这样如果面板可见= false,它将不会被渲染。