0

私は 30 以上の aspx ページを持っています。最近、挿入、更新、削除などのデータベース トランザクションを実行し、トランザクションが完了した後に F5 キーを押すかページを更新すると、同じトランザクションが発生するという問題を発見しました。

私は解決策を探しましたが、私が見つけたのは、不可能な各ボタンのビューステートをチェックする必要があるということだけです。それは、多くの作業があることを意味します。一般的な解決策が必要です。この問題で私を助けてください。

編集:

以下は、データベースの値を true または false に変更するボタンの 1 つのコードです。

 protected void btn_Publish_Click(object sender, EventArgs e)
{

    if (Convert.ToBoolean(int.Parse(hf_Published.Value.ToString())))
    {
        publish(false);
    }
    else
    {
        publish(true);

    }

}

コードの実行後、ページを更新すると同じコードが実行されますが、このメソッドにブレークポイントが配置されていることに気付きました。

4

4 に答える 4

2

何千人もの開発者が何年も使用している一般的なソリューションがあります。

解決策は次のとおりです。サーバーで侵入プロセス (挿入/更新/削除) を実行するたびに、ページをレンダリングするだけでなく、302 の応答を「トランザクションが成功しました」というメッセージを含む新しいページにリダイレクトします。

このように、F5 を押すと、トランザクションをトリガーする元のページではなく、このメッセージ ページが更新されます。

これがシナリオに直接適用されるかどうかは、あなた次第です。

http://en.wikipedia.org/wiki/Post/Redirect/Get

于 2012-04-06T12:15:38.843 に答える
2

これを試すことができます。これをいくつかのプロジェクトで使用し、正常に動作しました。

 public bool IsRefreshed
    {
        get
        {
            if (Convert.ToString(Session["RefreshTimeStamp"]) == Convert.ToString(ViewState["RefreshTimeStamp"]))
            {
                Session["RefreshTimeStamp"] = HttpContext.Current.Server.UrlDecode(System.DateTime.Now.ToString());
                return false;
            }
            else
            {
                return true;
            }
        }
    }




protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        ViewState["RefreshTimeStamp"] = Session["RefreshTimeStamp"];
    }



protected override void OnLoad(EventArgs e)
    {  

        if (!Page.IsPostBack)
        {
            Session["RefreshTimeStamp"] = HttpContext.Current.Server.UrlDecode(System.DateTime.Now.ToString());
        }
        base.OnLoad(e);
    }
于 2012-04-06T12:19:42.173 に答える
1

この問題を解決するには、次のことを確認してください。

  1. 必要に応じて送信ボタンを無効にする
  2. コードにいくつかの検証を追加し、二重エントリをチェックします
  3. 送信後にユーザーを別のページにリダイレクトする
于 2012-04-06T12:16:57.623 に答える
0

支払いなどのような実際の「トランザクション」(他の人がすでに説明している、リダイレクトなど)でない限り
、Dbと相互作用する、またはアプリのボトルネックとなるページのキャッシュを定義してみることもできます。
常にライブ情報が必要な場合(そしてそれが「生きている」タイプのアプリである場合)、そのソリューションでは運がありません(ただし、それでも)が、通常は、データをどの程度「新鮮」にするかについて、ある程度の有効期限を設けることができます。なれ。
ASP.NETページのキャッシュ

于 2012-04-06T12:25:28.400 に答える