假設點擊一個asp:button
後,我想存儲實際的「視圖」,每個控制器的選定值(如asp:checkbox)或用戶在inputbox上插入的輸入。我可以保存回髮狀態並將其恢復嗎?
比我改變頁面,帶有諸如「回到上一頁」的鏈接。在離開之前,我想這樣「恢復」舊的實際形式。
.NET可以嗎?或者我需要在變量中實現所有控件並將它們放入會話中?
假設點擊一個asp:button
後,我想存儲實際的「視圖」,每個控制器的選定值(如asp:checkbox)或用戶在inputbox上插入的輸入。我可以保存回髮狀態並將其恢復嗎?
比我改變頁面,帶有諸如「回到上一頁」的鏈接。在離開之前,我想這樣「恢復」舊的實際形式。
.NET可以嗎?或者我需要在變量中實現所有控件並將它們放入會話中?
你不需要會話來做到這一點。只需使用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;");
}
Wooowww ...非常漂亮的技巧:)我也應該把(-2)和管理得很好!謝謝!附:你知道這個不起作用的瀏覽器嗎?也許是因爲歷史不支持,或因爲回頭它不存儲舊數據......只是好奇... – markzzz 2012-03-13 08:14:55
很高興它幫助你。它幾乎適用於所有瀏覽器(在safari中進行測試,並在ya中進行征服);),當Javascript被禁用時,這不起作用。 – 2012-03-13 14:51:12
有幾種方法,你可以堅持怎樣或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時也能正常工作。一個更大的優勢是您可以控制要重定向的頁面。您甚至可以跨多個重定向恢復值。
謝謝,也許我會在用戶訪問其他頁面後使用它來恢復頁面(請參閱http://stackoverflow.com/questions/10600566/is-it-possible-to-save-and-restore-a-complete -aspx頁)。它似乎在一個小測試網站上工作正常。我只是在加載中刪除了'SaveForm',因爲它不保存恢復的頁面。當我自己需要時(搜索之後),我只會保存頁面。謝謝! – 2012-05-22 10:22:36
這是ASP.NET還是ASP.NET MVC? – 2012-03-12 14:27:19
ASP.NET 3.5,而不是MVC – markzzz 2012-03-12 14:30:13
http://msdn.microsoft.com/en-us/library/6c3yckfw%28v=vs.90%29.aspx – 2012-03-12 14:33:46