web-dev-qa-db-ja.com

.netでページの更新を検出する方法

私はButton_clickイベント。ページを更新している間、前のPostbackイベントが再びトリガーされます。 Postbackアクションを防ぐために、ページ更新イベントを識別するにはどうすればよいですか?

私はそれを解決するために以下のコードを試しました。実際、SharePointページにビジュアルWebパーツを追加しています。 Webパーツの追加はポストバックイベントであるため、Webパーツをページに追加するたびに!postbackは常にfalseになり、オブジェクト参照がnullであるため、elseループでエラーが発生します。

if (!IsPostBack){
    ViewState["postids"] = System.Guid.NewGuid().ToString();
    Cache["postid"] = ViewState["postids"].ToString();
}
else{
    if (ViewState["postids"].ToString() != Cache["postid"].ToString()){
        IsPageRefresh = true;
    }
    Cache["postid"] = System.Guid.NewGuid().ToString();
    ViewState["postids"] = Cache["postid"].ToString();
}

この問題を解決するにはどうすればよいですか?

16
Srikanth

詳細な here として、ビューステートの使用は私にとってはるかにうまく機能しました。基本的に:

bool IsPageRefresh = false;

//this section of code checks if the page postback is due to genuine submit by user or by pressing "refresh"
if (!IsPostBack)     
{
    ViewState["ViewStateId"] = System.Guid.NewGuid().ToString();
    Session["SessionId"] = ViewState["ViewStateId"].ToString();
}
else
{
    if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString())
    {
        IsPageRefresh = true;
    }

    Session["SessionId"] = System.Guid.NewGuid().ToString();
    ViewState["ViewStateId"] = Session["SessionId"].ToString();
}   
10
lathomas64

この記事はあなたの助けになるかもしれません http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET

各ページを一意に識別するために、ビューステートにGUIDを追加します。このメカニズムは、Pageクラス自体にいるときに正常に機能します。ページハンドラーに到達する前に要求を識別する必要がある場合は、別のメカニズムを使用する必要があります(ビューステートはまだ復元されていないため)。

Page.LoadCompleteイベントは、GUIDがページに関連付けられているかどうかを確認し、関連付けられていない場合は作成するのに適した場所です。

これを確認してください http://shawpnendu.blogspot.in/2009/12/how-to-detect-page-refresh-using-aspnet.html

5
Vinoth

簡単な解決策

それが誰かを助ける場合に備えて、私はこの単純な3行の解決策を投稿すると思いました。ポストセッションとビューステートのIsPageRefresh値は等しくなりますが、ページの更新時に同期がとれなくなります。そして、それはページをリセットするリダイレクトをトリガーします。クエリ文字列パラメータを保持する場合は、リダイレクトを少し変更する必要があります。

    protected void Page_Load(object sender, EventArgs e)
    {
        var id = "IsPageRefresh";
        if (IsPostBack && (Guid)ViewState[id] != (Guid)Session[id]) Response.Redirect(HttpContext.Current.Request.Url.AbsolutePath);
        Session[id] = ViewState[id] = Guid.NewGuid();

        // do something

     }
0
Roberto

POSTだけでなくHTTPGETで更新を検出したい場合は、これがハッキーな回避策です。これは、最近のブラウザーではほとんど機能します。

Javascript:

window.onload = function () {
    // regex for finding "loaded" query string parameter
    var qsRegex = /^(\?|.+&)loaded=\d/ig;
    if (!qsRegex.test(location.search)) {
        var loc = window.location.href + (window.location.search.length ? '&' : '?') + 'loaded=1';
        window.history.replaceState(null, document.title, loc);
    }
};

C#:

public bool IsPageRefresh 
{
    get
    {
        return !string.IsNullOrEmpty(Request.QueryString["loaded"]);
    }
}

ページが読み込まれると、ページをリロードせずにloaded=1のQueryStringパラメータを追加するように変更されます(ここでも、これ--window.history.replaceState--は 古風なブラウザ でのみ機能します) 。次に、ユーザーがページを更新すると、サーバーはクエリ文字列のloadedパラメーターの存在を確認できます。

警告:ほとんどは機能します

これが機能しないのは、ユーザーがアドレスバーをクリックしてを押した場合です。 enter。つまり、サーバーは誤検知を生成し、更新を検出します。確率が高い場合、ユーザーは実際にページを新しく再読み込みすることを意図していました。

目的によっては、これが望ましいかもしれませんが、ユーザーとして、ページをリセットすることを期待した場合、私は夢中になります。

私はあまり考えていませんが、アドレスを介して更新とリセットを区別するために、可能性がありますいくつかの魔法を書くことができますいずれか/すべてを使用するバー:

  • SessionStateSessionStateが有効になっていると仮定)およびloadedQueryStringパラメーターの値
  • window.onbeforeunloadイベントリスナー
  • キーボードイベント(検出 F5 そして Ctrl + R URLをすばやく変更してloaded QueryStringパラメーターを削除します。ただし、これはブラウザーの更新ボタンをクリックすると偽陰性になります)
  • クッキー

誰かが解決策を思いついた場合、私はそれを聞いてみたいです。

0
dx_over_dt

ページの更新を確認する別の方法。 Javaスクリプトまたはクライアント側なしでカスタムコードを記述しました。

よくわかりませんが、これが最善の方法ですが、回避策は良いと思います。

protected void Page_Load(object sender, EventArgs e)
    {
        if ((Boolean)Session["CheckRefresh"] is true)
        {
            Session["CheckRefresh"] = null;
            Response.Write("Page was refreshed");
        }
        else
        { }
    }
    protected void Page_PreInit(object sender, EventArgs e)
    {
        Session["CheckRefresh"] = Session["CheckRefresh"] is null ? false : true;
    }
0
Narender Kumar