0

ページの追加ユーザーを使用するなど、何らかの形でレコードを複製しているように見えるASP .Netアプリケーションを維持しています。再現できませんでしたが、送信時に次のようなクレイジーなことをするコードを見つけました。

if(crazy-code()){
    __doPostBack() // 2nd
}

そしてcrazy-codeも次のようなことをします

function crazy-code()
{
    ...
    __doPostBack() // 1st
    ...
    return true;
}

このコードが問題の原因であることを確認するために、両方を起動しようとしました__doPostBackが、実行できませんでした。理論的には、 (1st) を起動すると常に発生__doPostBackするはずであり、リクエストを送信し、その後クライアントコードを停止/無視する必要があります。が2回解雇された場合__doPostBack、その理由は何ですか? ブラウザ?スピード????

4

2 に答える 2

0

__doPostBack ()呼び出しはフォームを送信しますが、2 番目のフォームを呼び出すべきではありません。

間違っているかもしれませんが、Web ページで [送信] をクリックし、ページのリロード後に [F5] を押すと、問題を再現できると思います。ブラウザによっては「送信元データを再送信しますか?」などの質問が表示されます。「はい」を選択し、記録が重複していないか確認してください。

いずれにせよ、サーバー側でデータを挿入するときに重複値のチェックを追加する必要があると思います。

于 2012-10-01T17:35:54.240 に答える
0

テストコードを作成できました。FF と chrome では正常に動作しているように見えますが (1 件の送信)、IE9 (および互換バージョン) では 1、2、または 3 回ヒットしたようです。注: submit() はポストバックを引き起こします。CASE 1. Javascript ページの遅延:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>testing</title>
    <script type="text/javascript">
        function submitForm() {
            document.forms[0].submit();
            alert("delay");
            document.forms[0].submit();
        }
    </script>
</head>
<body>
    <form id="form1" name="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server" Width="220px"></asp:TextBox>
        <button onclick="submitForm(this)">CLICK</button>
        <br />
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>

コードビハインド:

protected void Page_Load(object sender, EventArgs e)
{
    if(IsPostBack)
    {
        incrementVal();
    }
}

private void incrementVal()
{
    var val = (int)(Session["val_" + TextBox1.Text] ?? 0);
    val++;
    Label1.Text += TextBox1.Text + ": " + val.ToString("00") + " - " + DateTime.Now.ToLongTimeString() + "<br/>";
    Session["val_" + TextBox1.Text] = val;
}

ここに画像の説明を入力

ケース 2: 応答が遅い

JS アラートを削除します。

function submitForm() {
    document.forms[0].submit();
    document.forms[0].submit();
}

サーバー側に遅延を追加します。

if(IsPostBack)
{
    incrementVal();
    Thread.Sleep(500);
}
于 2012-10-01T21:27:50.293 に答える