UpdatePanel控件不可用 - 未将对象引用设置为对象的实例

时间:2016-06-02 18:11:33

标签: c# asp.net ajax updatepanel

我有一个带有Label控件的LabelPanel,Label1和它外面的按钮Button1,以及UpdatePanel,Label2之外的另一个Label控件。单击该按钮时,我希望Label1中的Label文本更新:

ASPX页面

<form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" AsyncPostBackTimeout="0" />
    <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
        </Triggers>
        <asp:ContentTemplate>
            <asp:Label ID="Label1" runat="server"></asp:Label>
        </asp:ContentTemplate>
    </asp:UpdatePanel>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" />
    <asp:Label ID="Label2" runat="server"></asp:Label>
</form>

代码隐藏

protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
    Label2.Text = "some text";
    Label1.Text = "some text";
}

这应该是直截了当的 - 我应该能够通过按钮点击事件更新Label1文本。 Label2行成功(显然不会在没有页面回发的情况下出现),其中Label1行失败,“对象引用不是对象的实例”。为什么Label1为null,当它就在页面上时,只是它在UpdatePanel中?我应该如何实例化应该已经在页面上并且可访问的控件,就像Label2一样?

2 个答案:

答案 0 :(得分:1)

您的异步触发器必须在里面更新面板中。可能找不到它,因为它不在更新面板内。此外,因为您正在进行异步回发,所以只有更新面板的inisde才会刷新;因此,您实质上是“重置”标签1。

这就是为什么您的代码无法找到Label 1.执行此操作:

        

    <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
        </Triggers>
        <ContentTemplate>
            <asp:Label ID="Label1" runat="server"></asp:Label>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" />
            <asp:Label ID="Label3" runat="server"></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:Label ID="Label2" runat="server"></asp:Label>
</form>

这将有助于您查看。标签1和3现在将始终更新,但由于标签2位于更新面板之外,因此不会因为页面在回发时看不到这一点。

代码背后:

 protected void Button1_Click(object sender, EventArgs e)
 {
      Label3.Text = "label 3";
      Label2.Text = "label 2";
      Label1.Text = "label 1";
 }

结果:

enter image description here

答案 1 :(得分:0)

代码在UpdatePanel中有<asp:ContentTemplate></asp:ContentTemplate>而不是<ContentTemplate></ContentTemplate>标记。我纠正了这个,现在有效了。由于代码无法找到真正的ContentTemplate或其中的任何内容,因此控件超出了范围。