1
<script type="text/javascript">

    function ClientSideClick(myButton) {
        //make sure the button is not of type "submit" but "button"
        if (myButton.getAttribute('type') == 'button') {
            // disable the button
            myButton.disabled = true;
            //myButton.className = "btn-inactive";
            myButton.value = "Posting...";
        }
        return true;
    }

</script>



<asp:UpdatePanel ID="upComments" runat="server" UpdateMode="Always" >
    <ContentTemplate>

        <asp:ListView ... >

            <asp:Button ID="btnSubPostComment" runat="server" Text="Reply Comment"
                        CommandName="cmdPostSubComment" OnClientClick="ClientSideClick(this)" UseSubmitBehavior="false"

        </asp:ListView>

    </ContentTemplate>
</asp:UpdatePanel>

Javascript 関数 (ClientSideClick) は、処理中にボタンを無効にします。

問題は、ボタンに OnClientClick="ClientSideClick" UseSubmitBehavior="false" を含めると、更新パネル内にあるにもかかわらず、完全なポストバックが発生することです。

これら 2 つのプロパティ OnClientClic と UseSubmitBehavior を削除すると、ボタンは完全なポストバックを引き起こしません。なぜこれが起こるのか誰か知っていますか?

私がやりたかったのは、ボタンを無効にして、複数の送信を防ぐためにテキストを変更することだけです。

4

1 に答える 1

1

これがまさにあなたが探しているものかどうかはわかりませんが、私は通常これを使用します:

<asp:ScriptManager ID="ScriptManager1" runat="server" />
<script type="text/javascript">
var pbControl = null;
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(BeginRequestHandler);
prm.add_endRequest(EndRequestHandler);

function BeginRequestHandler(sender, args) {
    pbControl = args.get_postBackElement();
    pbControl.disabled = true;
}
function EndRequestHandler(sender, args) {
    pbControl.disabled = false;
    pbControl = null;
}
</script>
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:ListView ... >
            <asp:Button ID="btnSubPostComment" runat="server" Text="Reply Comment" CommandName="cmdPostSubComment" OnClientClick="this.value='Posting...';" />
        </asp:ListView>
    </ContentTemplate>
</asp:UpdatePanel>

唯一の問題は、最初の非同期ポストバックの後に同じボタンをもう一度クリックすると、「オブジェクトの現在の状態のため、操作は有効ではありません」というエラーがスローされることです。これは、500 内部サーバー エラーの形式で JavaScript 例外として表示される場合があります。いくつかの調査を行った後、私は出くわしました:

「Microsoft は最近 (2011 年 12 月 29 日)、.NET Framework のいくつかの重大なセキュリティの脆弱性に対処するための更新プログラムをリリースしました。MS11-100 は、潜在的な DoS 攻撃を処理するために最近導入されました。残念ながら、この修正プログラムにより、非常に大量のページ POST が壊れました。投稿されたデータ (フォーム フィールド) の数。MS11-100 では、ポストバック アイテムに 500 の制限が設定されています。最近のセキュリティ更新プログラムによって導入された新しい既定の最大値は 1000 です。"

Scott Gu がここに書いています: http://weblogs.asp.net/scottgu/archive/2011/12/28/asp-net-security-update-shipping-thursday-dec-29th.aspx

設定キーを web-config ファイルに追加すると、このエラーが解決されます。

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="2000" />
</appSettings>
于 2013-01-15T15:05:54.663 に答える