2012-03-12 22 views
3

asp:buttonをクリックした後、asp:checkboxのような各コントローラの選択された値、またはinputboxのユーザーが入力した実際の "view"を保存したいとします。ポストバックステータスを保存して復元することはできますか?

「私は前のページに戻る」などのリンクでページを変更します。私はそれを残す前に、古い実際のフォームを "復元"したいと思います。

.NETで可能ですか?あるいは、すべてのコントロールを変数に実装してセッションに入れる必要がありますか?

+0

このASP.NETまたはASP.NET-MVCですか? –

+0

ASP.NET 3.5、MVCでない – markzzz

+2

http://msdn.microsoft.com/en-us/library/6c3yckfw%28v=vs.90%29.aspx –

答えて

1

これを行うにはセッションは必要ありません。 JavaScriptを利用するだけです。

Page1.aspxとPage2.aspxという2つのページがあるとします。 Page1.aspxにテキストボックス、チェックボックス、ラジオボタンがあり、 "送信"ボタンがあります。ボタンをクリックすると、Page2.aspxが表示されます。

Page2.aspxのボタンを前のページに戻すだけです。このボタンをクリックすると、Page1.aspxに移動します。これらの値はまだ残ります。これを行うには、あなたが持続またはASP.NETページ間で値を渡すことができますどのようにいくつかの方法があります

protected void Page_Load(object sender, EventArgs e) 
{ 
btnBackButton.Attributes.Add("onClick", "javascript:window.history.go(-1);return false;"); 
} 
+0

Wooowww ...とても素敵なトリック:)私は(-2)を入れて、それをとてもうまく管理するべきです!ありがとうございました! P.S.あなたは、このdoesntが動作するブラウザを知っていますか?おそらく履歴がサポートされていないか、古いデータを保存していないために戻ってくるかもしれません...ちょっと待ってください... – markzzz

+0

嬉しいことに、あなたを助けました。それはほぼすべてのブラウザで動作します(サファリと征服者でテストされています;))、Javascriptが無効になっているとこれは動作しません。 –

3

あなたにPage2.aspxのPage_Loadイベントに次の行を追加します。

詳細はhereをご覧ください。

あなたは「トン」のコントロールを保存して復元することに言及しているので、私はこのプロセスを自動化する方法を見つけようとしました。

セッションをストレージとして使用して、すべてのコントロールの値をIPostBackDataHandlerの値に維持する方法を紹介します。とにかく実際にテストされていませんが、うまくいけば助かりますそれはロードとPage_Load/Page_PreRenderに暗黙的に節約すること

private FormStorage storage; 

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    storage = new FormStorage(this); 
} 

protected void BtnRedirect_Click(object sender, EventArgs e) 
{ 
    Response.Redirect("RedirectForm.aspx"); 
} 

注:

using System; 
using System.Collections.Generic; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public class FormStorage 
{ 
    private System.Web.UI.Page _page = null; 

    public Dictionary<String, Dictionary<String, String>> storage 
    { 
     get { return (Dictionary<String, Dictionary<String, String>>)_page.Session["FormStorage"]; } 
     set { _page.Session["FormStorage"] = value; } 
    } 

    public FormStorage(System.Web.UI.Page page) 
    { 
     _page = page; 
     initHandler(); 
     if (this.storage == null) 
     { 
      this.storage = new Dictionary<String, Dictionary<String, String>>(); 
     } 
     if(!this.storage.ContainsKey(_page.Request.Path)) 
      this.storage.Add(_page.Request.Path, new Dictionary<String, String>()); 
    } 

    private void initHandler() 
    { 
     _page.Init += Init; 
     _page.Load += Load; 
    } 

    private void Init(Object sender, EventArgs e) 
    { 
     loadForm(); 
    } 

    private void Load(Object sender, EventArgs e) 
    { 
     saveForm(); 
    } 

    private void loadForm() 
    { 
     var pageStorage = storage[_page.Request.Path]; 
     var e = pageStorage.GetEnumerator(); 
     while (e.MoveNext()) 
     { 
      loadControl(e.Current.Key, e.Current.Value); 
     } 
    } 

    private void loadControl(String ID, String value) 
    { 
     Control control = findControlRecursively(_page, ID); 
     if (control != null) 
     { 
      setControlValue(control, value); 
     } 
    } 

    private void setControlValue(Control control, String value) 
    { 
     if (control is ITextControl) 
     { 
      ITextControl txt = (ITextControl)control; 
      txt.Text = value == null ? "" : value; 
     } 
     else if (control is ICheckBoxControl) 
     { 
      ICheckBoxControl chk = (ICheckBoxControl)control; 
      chk.Checked = value != null; 
     } 
     else if (control is ListControl) 
     { 
      ListControl ddl = (ListControl)control; 
      if (value == null) 
       ddl.SelectedIndex = -1; 
      else 
       ddl.SelectedValue = value; 
     } 
    } 

    public void saveForm() 
    { 
     saveControlRecursively(this._page); 
    } 

    private void saveControlRecursively(Control rootControl) 
    { 
     if (rootControl is IPostBackDataHandler) 
     { 
      var postBackData = _page.Request.Form[rootControl.ID]; 
      storage[_page.Request.Path][rootControl.ID] = postBackData; 
     } 

     if (rootControl.HasControls()) 
      foreach (Control subControl in rootControl.Controls) 
       saveControlRecursively(subControl); 
    } 

    private static Control findControlRecursively(Control rootControl, String idToFind) 
    { 
     if (rootControl.ID == idToFind) 
      return rootControl; 

     foreach (Control subControl in rootControl.Controls) 
     { 
      Control controlToReturn = findControlRecursively(subControl, idToFind); 
      if (controlToReturn != null) 
      { 
       return controlToReturn; 
      } 
     } 
     return null; 
    } 
} 

ここでは別のページにリダイレクトするページ内examplary実装です。そのため、FormStorageインスタンスはPage_PreInitに作成する必要があります。

あなたがプログラムでPage_Load後の値を変更したい場合は、FormStoragePage_Load内のすべてのポストバックデータを自動保存されますので、これらの値が上書きされることを保証するために(Page_PreRender中など)を手動storage.saveForm()を呼び出す必要があります。

を編集してください。history.goのsh4nx0rのアプローチは、スケーラビリティが高いのでおそらく良いでしょう。私のアプローチはセッションを使用し、膨大な(可能な)ユーザーを持つインターネットアプリケーションには適していません。

私の1つ(小さい)利点は、JavaScriptが無効になっても機能するということです。大きな利点の1つは、リダイレクトするページを制御できることです。複数のリダイレクトにまたがって値を復元することもできます。

+0

ありがとう、たぶん私はユーザーがいくつかの他のページを訪問した後にページを復元するためにこれを使用します(http://stackoverflow.com/questions/10600566/is-it-possible-to-save-and-restore-a-completeを参照)。 -aspx-page)。小さなテストサイトでうまくいくようです。ロード中の 'SaveForm'を削除しました。復元されたページを保存しないためです。私は自分自身(検索後や何かの後)を望むときにのみページを保存します。ありがとう! –

関連する問題