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

UpdatePanel controls unavailable - Object reference not set to an instance of an object

我有一个带有标签控件 Label1 的 UpdatePanel,它外面有一个按钮 Button1,在 UpdatePanel 外面还有另一个标签控件 Label2。单击按钮时,我希望在 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 行失败并显示 "Object reference is not an instance of an object"。为什么 Label1 是空的,当它就在页面上时,只是在 UpdatePanel 中?我应该如何实例化应该已经在页面上并且可以访问的控件,就像 Label2 一样?

您的异步触发器必须 更新面板内。它可能找不到它,因为它不在更新面板内。此外,因为您正在进行异步回发,所以只会刷新更新面板的内部内容;因此你本质上是 "reseting" 标签 1.

这就是您后面的代码无法找到标签 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";
 }

结果:

代码在 UpdatePanel 中有 <asp:ContentTemplate></asp:ContentTemplate> 而不是 <ContentTemplate></ContentTemplate> 标签。我更正了这个,它现在可以工作了。控件超出范围,因为代码找不到真正的 ContentTemplate 或其中的任何内容。