2012-03-12 3 views
3

Предположим, что после щелчка на asp:button я хотел бы сохранить фактический «вид» с выбранным значением для каждого контроллера, например, asp: checkbox или input, вставленным пользователями на поле ввода.Могу ли я сохранить статус обратной передачи и восстановить его?

Than, я меняю страницу со ссылкой, например, «назад к предыдущей странице». Я бы хотел «восстановить» старую фактическую форму, прежде чем покинуть ее.

Возможно ли это с .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. У вас есть текстовые поля, флажки, радиокнопки на странице.aspx, и у вас есть кнопка «Отправить». Нажав на кнопку, она переместится в страницу .aspx.

Просто нажмите кнопку «Назад на предыдущую страницу» на странице .aspx, которая при нажатии приведет вас к странице1.aspx со всеми этими значениями, которые все еще существуют. Чтобы сделать это, добавьте эту строку в вашем случае page_load Page2.aspx

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

Wooowww ... очень хорошие трюки :) Я тоже должен поставить (-2) и справиться с этим очень хорошо! Спасибо! Постскриптум Знаете ли вы какой-либо браузер, где это не работает? Может быть, потому, что история не поддерживается, или потому, что назад она не хранит старые данные ... Просто любопытные ... – markzzz

+0

Рад, что это помогло вам. Он работает почти во всех браузерах (проверен на сафари и завоеватель для ya;)). Это не работает, когда Javascript отключен. –

3

Есть несколько способов, как вы можете сохраняющиеся или передавать значения между страницами ASP.NET.

Посмотрите here для получения дополнительной информации.

Поскольку вы упомянули, что у вас есть «тонны» элементов управления для хранения и восстановления, я попытался найти способ автоматизировать этот процесс.

Вот мой подход, который использует сеанс как хранилище для сохранения всех значений элементов управления типа IPostBackDataHandler. На самом деле это не проверено, но, надеюсь, полезно в любом случае.

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; 
    } 
} 

Вот Простейшая реализация в страницу, которая перенаправляет на другую страницу:

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"); 
} 

Обратите внимание, что он загружает и сохраняет неявным на Page_Load/Page_PreRender. Поэтому экземпляр FormStorage должен быть создан в Page_PreInit.

Если вы хотите изменить значения после Page_Load программно, вам нужно вызвать storage.saveForm() вручную (например, в Page_PreRender), чтобы гарантировать, что эти значения будут переопределены, поскольку FormStorage будет автоматически сохранять все данные обратной передачи в Page_Load.

Редактировать: Подход sh4nx0r от history.go, вероятно, лучше, поскольку он более масштабируемый. Мой подход использует сеанс и не подходит для интернет-приложения с огромным количеством (возможных) пользователей.

Одно (небольшое) преимущество моего заключается в том, что он будет работать, даже если javascript отключен. Еще одно преимущество заключается в том, что вы можете контролировать, на какую страницу вы хотите перенаправить. Вы даже можете восстановить значения для нескольких переадресаций.

+0

Спасибо, может быть, я буду использовать это, чтобы восстановить страницы после того, как пользователь посетил некоторые другие страницы (см. Http://stackoverflow.com/questions/10600566/is-it-possible-to-save-and-restore-a-complete -aspx-страницы). Кажется, что он отлично работает на небольшом тестовом сайте. Я просто удалил «SaveForm» в загрузке, потому что он не сохраняет восстановленную страницу. Я буду сохранять только страницы, когда захочу сам (после поиска или чего-то еще). Благодаря! –

Смежные вопросы