4

更新時のAsp.Netボタンイベントの複製が再び発生しますか??? GUID?

こんにちは、ウェブサイトで、ユーザーがボタンをクリックしてページのポストバックを行うと、ユーザーがページを更新するか F5 キーを押すと、ボタン メソッドが再度呼び出されます。

ページを同じページに再度リダイレクトせずにページの更新を防ぐ方法を知っている人はいますか?

if (page.isRefresh) などのようなもの...または存在する場合は、javascript ソリューションの方が優れています。

これは機能するように見えます....しかし、更新するとポストバックせず、テキストボックスに前の値が表示されます

http://www.dotnetspider.com/resources/4040-IsPageRefresh-ASP-NET.aspx

private Boolean IsPageRefresh = false;
protected void Page_Load(object sender, EventArgs e)
{        
    if (!IsPostBack)
    {
        ViewState["postids"] = System.Guid.NewGuid().ToString();
        Session["postid"] = ViewState["postids"].ToString();
        TextBox1.Text = "Hi";

    }
    else
    {
        if (ViewState["postids"].ToString() != Session["postid"].ToString())
        {
            IsPageRefresh = true;
        }
        Session["postid"] = System.Guid.NewGuid().ToString();
        ViewState["postids"] = Session["postid"];
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    if (!IsPageRefresh) // check that page is not refreshed by browser.
    {
        TextBox2.Text = TextBox1.Text + "@";

    }
}
4

5 に答える 5

8

コメントありがとうございます。間違いをお詫びします。このコードは http://www.codeproject.com/KB/aspnet/Detecting_Refresh.aspxで見つかりまし た。今回はテストしました;)

    private bool _refreshState;
    private bool _isRefresh;

    protected override void LoadViewState(object savedState)
    {
        object[] AllStates = (object[])savedState;
        base.LoadViewState(AllStates[0]);
        _refreshState = bool.Parse(AllStates[1].ToString());
        _isRefresh = _refreshState == bool.Parse(Session["__ISREFRESH"].ToString());
    }

    protected override object SaveViewState()
    {
        Session["__ISREFRESH"] = _refreshState;
        object[] AllStates = new object[2];
        AllStates[0] = base.SaveViewState();
        AllStates[1] = !(_refreshState);
        return AllStates;
    }

    protected void btn_Click(object sender, EventArgs e)
    {
        if (!_isRefresh)
            Response.Write(DateTime.Now.Millisecond.ToString());
    }
于 2009-04-05T07:30:28.837 に答える
4

Page.IsPostBack プロパティをテストして、ページが最初のリクエストに応答しているかどうか、またはボタン クリック イベントなどの PostBack を処理しているかどうかを確認できます。ここにもう少し情報があります: IsPostBack の w3schools

残念ながら、IsPostBack は、ユーザーがボタンをクリックしたときと、ボタン アクションが実行された後にページを更新したときに true になるため、問題は解決しません。

一部のデータに対して CRUD を実行するようなタスクを実行している場合は、処理が完了したときに Response.Redirect でユーザーを同じページに戻して、この問題を回避できます。コンテンツをリロードするという副次的な利点があり (DB にレコードを追加したと仮定すると、ページに表示されるようになります...)、更新の問題の動作を防ぎます。唯一の注意点は、履歴をさかのぼってフォームを再送信することです。

ポストバックは、Asp.net の実装の選択としては不適切であり、一般的に Webforms プラットフォームを台無しにしてしまいます。

于 2009-04-05T06:01:13.857 に答える
1

これでは問題は解決しません。

まず、ビュー ステートにトークンを保存することはお勧めできません。無効にすることができるからです。代わりに制御状態を使用してください。ただし、HttpModule の方が優れたソリューションです。

全体として、これはとにかく機能しません。別のタブ/ウィンドウを開くと、前のタブ/ウィンドウのセッションは無効になります。したがって、それを制動します。ページが最初に読み込まれるたびに、何らかの方法で一意の値を保存する必要があります。それを使用してリクエストの送信元を特定し、「リフレッシュ チケット」を確認します。ご覧のとおり、1 人のユーザーのオブジェクトは、行われたリクエストの量、この情報を保存する場所と期間によってはかなり大きくなる可能性があります。

かなり複雑なので、これに対する解決策は見たことがありません。

于 2012-02-22T15:21:08.243 に答える