2011-07-22 9 views
1

私はMVVMを使用しているプロジェクトのソリューションを見つけられなかったので、私は助けが必要です。 私は、2つのユーザーコントロールを持つUpdatePanelを含むDefault.aspxを持っています。最初のコントロールはフィルタリングするフィールドがあるFilterControlです。 2番目のコントロールは、FilterControlでボタンの検索を押すと、データベースのページングを許可し、データを取り込むGridViewです。クエリが100個のレコードを返すとします。ですから、PageSizeを20の結果に設定すると、GridViewに5ページありますか?リストに戻る前へ次へ.NETでの制御

一方、私は、GridViewからアイテムのIdパラメータを受け取り、それに関する情報を示すFormViewを持つ詳細ページを持っています。 aspのすぐ上に:FormViewのコード私は、セッション変数内の対応するViewModelを介してgridviewからデータをフィルタリングし、次のと前にする必要があるアイテムを計算する別のユーザーコントロールを持っているので、 "リストに戻る" 「前の」リンクと「次の」リンク。前と次のリンクが正しくロードされます。 Response.Redirect(PrevLink)を行うOnClickイベントを持つLinkBut​​tonです。たとえば、PrevLinkはページが〜/ details.aspx?Id = 5にリダイレクトされるリンクです。

私はeventHandlerとHistoryEventArgs全体で非同期的にナビゲーションを制御していますので、ブラウザの[戻る]ボタンを押すとすべてが正常でdefault.aspxページで目的の結果が得られます。たとえば、gridviewのページインデックスを変更する、またはフィルタで新しいクエリを実行するときに、私はScriptManagerのAddHistoryPointを呼び出し、いくつかのキーと値を保存します(フィルタフィールド、ページ数、等)。

問題は、Back to List LinkBut​​tonを押したときに発生します。詳細ページに行く前のデータと同じであることを願っています。私はこのボタンのOnClickイベントでResponse.Redirect( "〜/ default.aspx")を持っています。

これを管理する方法はありますか?

ありがとうございます!ここ

答えからコードをコピーし


の答えをいただき、ありがとうございます。 @Guvanteクライアント側で「リストに戻す」をしたくないのは、「詳細」ページを編集するときに、ナビゲーションコントロールの可視プロパティがfalseに設定されているためです。私は自分自身を正しく表現していないと思う。しかし、私はaspxページのOnClickイベントでResponse.Redirectを持っていません。私がページのソースコードで持っているのは、OnClick = lkbBackToList_Navigateです。

私はこのように分離コードでそれを持っている:

string key = string.Format("{0}.{1}.{2}", this.GetType(), nameValue, index); 

例:

protected void lkbNext_Navigate(object sender, EventArgs e) 
{ 
    Response.Redirect(NavigationViewModel.NextUrl); 
} 

protected void lkbPrevious_Navigate(object sender, EventArgs e) 
{ 
    Response.Redirect(NavigationViewModel.PreviousUrl); 
} 

protected void lkbBackToList_Navigate(object sender, EventArgs e) 
{ 
    Response.Redirect(NavigationViewModel.BackToListUrl); 
} 
@msarchet this is some of my code in default.aspx code behind. When I do postback I save the state of the filters, pageindex and so on in session 

public event EventHandler<HistoryEventArgs> CaptureClientBrowsing; 

protected void Page_OnInit(EventArgs e) 
{ 
    this.CaptureClientBrowsing += new EventHandler<HistoryEventArgs>(CaptureClientBrowsing_Event); 
} 

protected override void SaveDataInSession() 
{ 
    SaveInSession("FilterViewModel", this.FilteringControl.ViewModel); 
    SaveInSession("PageIndex", this.CurrentPageIndex); //CurrentPageIndex is a property with the page index of the gridview 
} 

protected void CaptureClientBrowsing_Event(object sender, HistoryEventArgs e) 
{ LoadDataFromSession(e.State); //e.State is a NameValueCollection with the values stored in session for example FilterViewModel has the user control FilteringControl and "PageIndex" has the page index of the gridview ControlsDataBinding(); 
} 

SaveInSession方法ちょうど[キー] =それは次のようにキーが文字列であるオブジェクトのセッションを維持しますキーの番号は

"ASP.customers_default_aspx.PageIndex.1"` so `Session[key]=1 

グリッドの他のページ(例:ページ番号6)をクリックすると、キー変数の値を表示すると、

"ASP.customers_default_aspx.PageIndex.2"` and `Session[key]=5 

ここに私は立ち往生しています。詳細ページからデフォルトページにブラウズすると、ブラウザで戻るとCaptureClientBrowsing_Eventが発生し、コントロールが正しく読み込まれ、フィルタの値も正しく読み込まれます。

私が望むのは、「リストに戻る」LinkBut​​tonをクリックすると、コントロールとフィルターがロードされることです。履歴引数を持たない場合、NameValueCollectionを取得するにはどうすればよいですか?私が次へ3回クリックし、次にBakをクリックして、ロードするセッション値をどのように知るのですか?

おそらく、多くの質問がありますが、これは扱いが難しいかもしれませんが、私はできるだけ具体的にしようとしました。

+0

を復元することができますが、私は、コードの一部を入れているコード – msarchet

+0

@msarchetのいくつかを示すことができ、多分あなたは私のために – Alvmad

答えて

0

ユーザーが「listpage」から「detailpage」に移動し、ブラウザ「戻る」をクリックしたときに正しく動作していると言いました。 CaptureClientBrowsingイベントはどのようにして起動されますか?それを示すコードを投稿できますか?

[Back To List]をクリックしても同じメカニズムを再利用できませんでしたか?

更新: さて、Response.Redirect()をリストページに追加すると、追加の状態情報が返される必要があります。

クエリーストリングパラメータを渡したり、クッキーを設定したり、別のセッション変数を設定するなど、一般的な手法を使用できます。

リストページのInitまたはLoadの信号を検出し、LINQはセッションキーを照会してmaxHistoryIndexを取得し、maxHistoryIndexから派生したキーを使用してセッションから状態を復元します。

など。彼らはlistpageを通じてページングた後detailpageを3回クリックした場合、maxHistoryIndex = 3、あなたはSession[String.Format("ASP.customers_default_aspx.PageIndex.{0}", maxHistoryIndex)]

+0

私はこのようなEventHandlerがあるため、CaputreClientBrowsingイベントが発生します:publicイベントEventHandler CaptureClientBrowsing;ページのPage_Initには、CaptureClientBrowsing + =新しいEventHandler (CaptureClientBrowsing_Event)があります。 CaptureClientBrowsing_Eventは、履歴ブラウザのコールバックが完了すると起動します。私はリストをBackにクリックすると、Response.Redirect(NavigationViewModel.BackToListUrl)を通してユーザーがDefault.aspxに行くので、このメカニズムを再利用することはできません。それについてどう思いますか?ありがとう:) – Alvmad

0

このボタンのOnClickイベントにResponse.Redirect( "〜/ default.aspx")があります。

問題が発生すると、リストページが新しいものとして読み込まれるようになります。代わりに、リストから離れたページ数を追跡して、onclickクライアント側をhistory.go(-pages)に設定して戻すことをお勧めします。

+0

感謝を助けることができます私を助けようとしている@Guante。 – Alvmad

+0

@ Alvmad:あなたのセッションオブジェクトにはまださまざまな値が設定されていませんか?これらの履歴要素を再利用するためにDefault.aspxが読み込まれたときにチェックするセッション変数を設定できますか? – Guvante

+0

はい私は最終的に、分離されたセッションオブジェクトにフィルタの値を格納し、それが機能しました!ありがとう:) – Alvmad

関連する問題