2

为什么以下给我行 B(Label2,UpdatePanel 外部)的编译错误,而不是 A 行(Label1,UpdatePanel 内部)的编译错误?我本来希望这两行都会出错,因为两个控件都在同一个中继器内,因此不应在中继器外部直接访问,因为没有一个唯一的实例。

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Label1.ClientID;  // Line A - compiles fine
        Label2.Text = Label2.ClientID;  // Line B - "The name 'Label2' does not exist in the current context"
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <asp:Repeater runat="server" ID="Repeater1">
                <ItemTemplate>
                    <asp:UpdatePanel runat="server" ID="UpdatePanel1">
                        <ContentTemplate>
                            <asp:Label ID="Label1" runat="server" Text="Label1" />
                        </ContentTemplate>
                    </asp:UpdatePanel>
                    <asp:Label ID="Label2" runat="server" Text="Label2" />
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </form>
</body>
</html>
4

3 回答 3

1

我敢打赌,如果您注释掉 B 行,您将在执行时收到运行时错误。Label1 将是一个空引用。

当您在 ASPX 页面中创建控件时,Visual Studio 会尝试通过将控件添加到扩展页面类的设计器文件中的代码来帮助您。在这种情况下,它会在不应该添加的时候添加一个。

简短的回答是这是一个错误。您应该提交它,但它不应该是一个阻塞问题。

于 2009-02-12T09:25:11.460 回答
0

真正的问题是为什么要在中继器中创建多个更新面板?把一个放在中继器外面并称之为好。或者,如果您只想刷新一些文本而不使用更新面板,请使用带有一些客户端脚本的回调来设置 dom 元素。看看这个http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/

于 2009-02-12T13:33:53.827 回答
0

无论如何,这些都不合适。您不应该尝试直接引用 ItemTemplate 中包含的控件。

如果你想在运行时修改这些标签,你应该使用 OnItemDataBound 和 FindControl。要在 UpdatePanel 中“找到”标签,您需要使用 UpdatePanel.ContentTemplateContainer.FindControl()。

于 2009-03-06T16:34:56.257 回答