2011-01-25 21 views
4

別のブラウザタブでユーザーを編集製品ページに誘導するインデックスページがあります。ページリフレッシュ対IsPostBack

インデックスが編集された製品ごとに、セッション["ProductID"]が書き換えられます。

Editページでは、このタブと製品の一意の識別子を持っているために、次のコードを持っています

if (!IsPostBack) //first time page load 
{ 
    Random R = new Random(DateTime.Now.Millisecond + DateTime.Now.Second * 1000 + DateTime.Now.Minute * 60000 + DateTime.Now.Minute * 3600000); 
    PageID.Value = R.Next().ToString(); 

    Session[PageID.Value + "ProductID"] = Session["ProductID"]; 
} 

これは動作しますが、同じユーザーが複数のタブを開いたとき、私は唯一のセッション[PageID.Valueを参照+ "ProductID"]私のコードでは、私は常に適切なIDを持っています。 (私はイントラネットのための信頼できる環境で働いているので、私はセキュリティのレベルではあまり気にしません)。

ユーザーがF5キーを押してページを更新すると、問題が発生します。セッション[PageID.Value + "ProductID"]は、彼が最後に開いた製品のSession ["ProductID"]を取得します。例えば

ユーザー1は、彼らは通常、すべてが正常に動作ツールを使用するたびに

ユーザー1は、TAB2に

をproduct2を開き、TAB1に製品1を開きます。ただし:製品1ページで

ユーザー1は、更新ボタン(F5)をヒット製品1ページがproduct2ページ

なっからページの更新を検出するためにそこの方法ですので、「最初のロード/他のページからのリダイレクト」セッション[PageID.Value + "ProductID"]を更新しないように私のページに伝えることができますか?

+0

Request.Headers ["HttpReferer"]の存在をテストするかどうかを素早くテストする価値があります。 –

+0

私はRequest.UrlReferrer.ToString()を試してみましたが、最初にページを読み込むときに、インデックスページを参照元として取得しました。 残念ながら、F5キーでページを更新すると、インデックスページが表示されます。リファラーが変更される唯一の方法は、編集ページでポストバックを実行すると、リファラーが編集ページになります。 – LanFeusT

答えて

2

私は非常によく似た問題を、セッションに1つ、ViewStateまたはURL(QueryString)に2つ保存することで解決しました。

Page_Loadの2つの値を比較すると、ページが最初に読み込まれてからセッション変数が変更されたかどうかがわかります。これはあなたが必要とするものでなければなりません。

EDIT:コード(警告 - 私は3年前にそれを書いたので、実際のコードを見ていない)のラフスケッチ:上記のコードで

protected string currentProductID 
{ 
    get 
    { 
     return Request.QueryString["ProductID"]; 
     //or: 
     //return (string)ViewState["ProductID"]; 
     //or: 
     //return HiddenField1.Value; 
    } 
    set 
    { 
     Response.Redirect(ResolveUrl("~/MyPage.aspx?ProductID=" + value)); 
     //or: 
     //ViewState.Add("ProductID", value); 
     //or: 
     //HiddenField1.Value = value; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    //If the problem only occurs when not posting back, wrap the below in 
    // an if(!IsPostBack) block. My past issue occurred on both postbacks 
    // and page refreshes. 

    //Note: I'm assuming Session["ProductID"] should never be null. 

    if (currentProductID == null) 
    { 
     //Loading page for the first time. 
     currentProductID = (string)Session["ProductID"]; 
    } 
    else if (currentProductID != Session["ProductID"]) 
    { 
     //ProductID has changed since the page was first loaded, so react accordingly. 
     //You can use the original ProductID from the first load, or reset it to match the one in the Session. 
     //If you use the earlier one, you may or may not want to reset the one in Session to match. 
    } 
} 

、ViewStateのに変わりノート(隠しコントロールの値を含む)は、次のポストバックでのみ有効になります。リフレッシュすると、最新の値に戻ります。私の場合は、それが私が望んだものでしたが、それはあなたの状況に合っていないように思えます。それでも、あなたがこれをどのように実装するかによって、その情報はあなたに役立つでしょう。

currentProductIDSession[PageID.Value + "ProductID"]を比較した議論は、私がすでに多くのコードを投稿しているために出されたもので、あなたがしようとしていることの詳細はわかりません。しかし、Session、ViewState、およびQueryStringを使用して、ページの状態と履歴に関する情報を収集する方法はさまざまです。

うまくいけば、それはあなたに一般的な考えを与えるはずです。それがあなたを動かすのに十分でないかどうか私に教えてください。

+1

どこに行っているのか分かりません。あなたはいくつかのコードを参照することができますか?ありがとう! – LanFeusT

+0

残念ながら、リフレッシュをキャッチしているようではありません。しかし、F5キーを押すかリロードページを押すと、値はnullにリセットされ、常に最初のifに戻ります。 – LanFeusT

+0

@LanFeusT:ViewStateまたはURLクエリを使用していますか文字列? URLにあるものは、更新時に利用可能である必要があります。あなたはどこかのコードでそれをリセットしていますか? –

4

個人的には、私はURLパラメータに行きます。例えば。製品IDをURLパラメータとして渡します。

パラメータなしのページが必要な場合は、たとえば次のように指定できます。

  1. パラメータをページに渡します。
  2. ページをリロード自体をパラメータが存在すると、パラメータ

をこのように除去した場合、あなたでし最初の呼び出し(=パラメーター存在)と第二+コール(パラメータが存在しない)との間にdistingues。

+0

私は見ていますが、ページをリロードすると、このページに固有のセッション[PageID.Value + "ProductID"]は消えてしまいます。クエリ文字列をチェックしてIDを取得すると、文字列には何がありますか?私が文字列を残すと、誰もがクエリー文字列のIDを変更し、アクセスすべきでないものにアクセスすることができます。または私はあなたを間違って理解していますか? – LanFeusT

+0

あなたの「アクセスすべきでないもの」について:私は通常、データベース内のパーミッションテーブル(例えば、「プロダクト1へのアクセス許可を持っている」など)でこのようなシナリオを実装し、ログインしたユーザーが要求されたプロダクトページ。 –

2

thisをご覧ください。私はそれがあなたが探しているものに近いと思う。

+0

これはおそらく動作しますが、私はこの問題に対する解決策を見つけたいと思いますが、悪い場合にはこれを元に戻します! – LanFeusT

関連する問題