4

UpdatePanel の ASP.NET パネルの DefaultButton プロパティで LinkBut​​tons を使用しようとしています。部分的なポストバックではなく完全なポストバックが行われないように、クリックイベントの接続について説明している他のさまざまな回答を読んで使用しました。ページが読み込まれたら、ASP.NET パネルの DefaultButton プロパティが機能するように、LinkBut​​ton の .click 関数を接続します。

UpdatePanel をミックスに持ち込むまで、これはすべて正常に機能します。UpdatePanel では、部分的なポストバックがある場合、.click 関数を接続するスクリプトが部分的なポストバックで呼び出されず、Enter キーを押すと、LinkBut​​ton がトリガーされるのではなく、フォームが完全に送信されます。

LinkBut​​ton の .click 関数を再接続するために、部分的なポストバックの後に JavaScript を実行するにはどうすればよいですか?

問題を示すサンプルページを作成しました。1) .click 関数をフックするコードが呼び出されたとき、および 2) .click 関数が呼び出されたとき (これは、イベントが接続された後にテキスト ボックスで Enter キーを押したときにのみ発生します) を示す 2 つのアラートがあります。 )。このコードをテストするには、テキスト ボックスに何かを入力して Enter キーを押します。テキストはラベル コントロールにコピーされますが、"Wiring up Event Click" アラートは表示されません。別の文字を追加してもう一度 Enter キーを押すと、テキストがラベル コントロールにコピーされずに完全なポストバックが返されます (LinkBut​​ton が呼び出されていないため)。これは完全なポストバックだったので、Wiring Up Event Click イベントが再度呼び出され、フォームは次回も適切に機能します。

これは ASP.NET 3.5 で行われています。

テスト ケース コード:

<%@ Page Language="C#" Inherits="System.Web.UI.Page" Theme="" EnableTheming="false" AutoEventWireup="true" %>

<script runat="server">
    void cmdComplete_Click(object sender, EventArgs e)
    {
        lblOutput.Text = "Complete Pressed: " + txtInput.Text;
    }

    void cmdFirstButton_Click(object sender, EventArgs e)
    {
        lblOutput.Text = "First Button Pressed";
    }

    protected override void OnLoad(EventArgs e)
    {
        HookupButton(cmdComplete);
    }

    void HookupButton(LinkButton button)
    {
        // Use the click event of the LinkButton to trigger the postback (this is used by the .click code below)
        button.OnClientClick = Page.ClientScript.GetPostBackEventReference(button, String.Empty);

        // Wire up the .click event of the button to call the onclick function, and prevent a form submit
        string clickString = string.Format(@"
            alert('Wiring up click event'); 
            document.getElementById('{0}').click = function() {{ 
                alert('Default button pressed'); 
                document.getElementById('{0}').onclick(); 
            }};", button.ClientID, Page.ClientScript.GetPostBackEventReference(button, ""));
        Page.ClientScript.RegisterStartupScript(button.GetType(), "click_hookup_" + button.ClientID, clickString, true);
    }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title>DefaultButton/LinkButton Testing</title>
    <style type="text/css">
        a.Button { line-height: 2em; padding: 5px; border: solid 1px #CCC; background-color: #EEE; }
    </style>
</head>
<body>
    <h1>
        DefaultButton/LinkButton Testing</h1>
    <form runat="server">
    <asp:ScriptManager runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <div style="position: relative">
                <fieldset>
                    <legend>Output</legend>
                    <asp:Label runat="server" ID="lblOutput" />
                </fieldset>
                <asp:Button runat="server" Text="First Button" ID="cmdFirstButton" OnClick="cmdFirstButton_Click" UseSubmitBehavior="false" />
                <asp:Panel ID="Panel1" runat="server" DefaultButton="cmdComplete">
                    <label>
                        Enter Text:</label>
                    <asp:TextBox runat="server" ID="txtInput" />
                    <asp:LinkButton runat="server" CssClass="Button" ID="cmdComplete" OnClick="cmdComplete_Click" Text="Complete" />
                </asp:Panel>
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:Button runat="server" ID="cmdFullPostback" Text="Full Postback" />
    </form>
</body>
</html>
4

1 に答える 1

2

最後にこれに対する解決策を見つけました-ScriptManager.RegisterStartupScript代わりに使用する必要がありましたPage.ClientScript.RegisterStartupScript-これはUpdatePanels内で機能します。

于 2010-06-02T08:22:57.243 に答える