2012-03-12 66 views
3

假设点击一个asp:button后,我想存储实际的“视图”,每个控制器的选定值(如asp:checkbox)或用户在inputbox上插入的输入。我可以保存回发状态并将其恢复吗?

比我改变页面,带有诸如“回到上一页”的链接。在离开之前,我想这样“恢复”旧的实际形式。

.NET可以吗?或者我需要在变量中实现所有控件并将它们放入会话中?

+0

这是ASP.NET还是ASP.NET MVC? – 2012-03-12 14:27:19

+0

ASP.NET 3.5,而不是MVC – markzzz 2012-03-12 14:30:13

+2

http://msdn.microsoft.com/en-us/library/6c3yckfw%28v=vs.90%29.aspx – 2012-03-12 14:33:46

回答

1

你不需要会话来做到这一点。只需使用JavaScript。

考虑你有两页Page1.aspx和Page2.aspx。 您在Page1.aspx上有文本框,复选框和单选按钮,并且您有一个“提交”按钮。通过点击按钮它需要Page2.aspx。

只需在Page2.aspx上有一个“返回上一页”按钮,点击该按钮即可将您带到Page1.aspx,所有这些值仍然存在。要做到这一点,添加此行对你Page2.aspx Page_Load事件

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

Wooowww ...非常漂亮的技巧:)我也应该把(-2)和管理得很好!谢谢!附:你知道这个不起作用的浏览器吗?也许是因为历史不支持,或因为回头它不存储旧数据......只是好奇... – markzzz 2012-03-13 08:14:55

+0

很高兴它帮助你。它几乎适用于所有浏览器(在safari中进行测试,并在ya中进行征服);),当Javascript被禁用时,这不起作用。 – 2012-03-13 14:51:12

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

需要注意的是IT负载和Page_Load/Page_PreRender隐含扑救。因此,必须在Page_PreInit中创建FormStorage实例。

如果你想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',因为它不保存恢复的页面。当我自己需要时(搜索之后),我只会保存页面。谢谢! – 2012-05-22 10:22:36

相关问题