2

次のコマンドを実行すると、行 B (Label2、UpdatePanel の外側) ではコンパイル エラーが発生するのに、行 A (Label1、UpdatePanel の内側) ではエラーが発生しないのはなぜですか? 両方のコントロールが同じリピーター内にあり、一意のインスタンスが 1 つもないため、リピーターの外部から直接アクセスできないため、両方の行でエラーが発生すると予想していました。

<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 は null 参照になります。

ASPX ページでコントロールを作成すると、Visual Studio は、ページのクラスを拡張するデザイナ ファイル内のコード ビハインドにコントロールを追加することで、ユーザーを支援しようとします。この場合、追加すべきではないときに追加しています。

簡単な答えは、それはバグです。送信する必要がありますが、ブロックの問題にはなりません。

于 2009-02-12T09:25:11.460 に答える
0

本当の問題は、なぜリピーターに複数の更新パネルを作成するのですか? リピーターの外に1つ置いて、それを良いと呼びます。または、更新パネルを使用せずに一部のテキストを更新するだけの場合は、クライアント側のスクリプトでコールバックを使用して 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 に答える