私は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();
}
この問題を解決するにはどうすればよいですか?
詳細な 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();
}
この記事はあなたの助けになるかもしれません 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
簡単な解決策
それが誰かを助ける場合に備えて、私はこの単純な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
}
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。つまり、サーバーは誤検知を生成し、更新を検出します。確率が高い場合、ユーザーは実際にページを新しく再読み込みすることを意図していました。
目的によっては、これが望ましいかもしれませんが、ユーザーとして、ページをリセットすることを期待した場合、私は夢中になります。
私はあまり考えていませんが、アドレスを介して更新とリセットを区別するために、可能性がありますいくつかの魔法を書くことができますいずれか/すべてを使用するバー:
SessionState
(SessionState
が有効になっていると仮定)およびloaded
QueryStringパラメーターの値window.onbeforeunload
イベントリスナーloaded
QueryStringパラメーターを削除します。ただし、これはブラウザーの更新ボタンをクリックすると偽陰性になります)誰かが解決策を思いついた場合、私はそれを聞いてみたいです。
ページの更新を確認する別の方法。 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;
}