假设在点击asp:button
之后,我想存储实际的“视图”,每个控制器都有选定的值,例如asp:复选框,或用户在输入框上插入的输入。< / p>
然后,我用“回到上一页”等链接更改页面。在离开之前,我想“恢复”旧的实际形式。
.NET可以吗?或者我需要实现变量中的所有控件并将它们放在会话中?
答案 0 :(得分:3)
有几种方法可以在ASP.NET页面之间保留或传递值。
查看here了解更多信息。
因为您已经提到要存储和恢复“吨”控件,所以我试图找到一种方法来自动化此过程。
这是我的方法,它使用Session作为存储来保存类型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
中)以确保覆盖这些值,因为{{1} }将自动保存FormStorage
中的所有回发数据。
编辑:sh4nx0r的Page_Load
方法可能更好,因为它更具可扩展性。我的方法使用Session,不适合拥有大量(可能)用户的互联网应用程序。
我的一个(小)优势是,即使禁用了javascript,它也能正常工作。一个更大的优点是您可以控制要重定向的页面。您甚至可以在多个重定向中恢复值。
答案 1 :(得分: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;");
}