今天在做項目時,測試人員提出了一條bug,起初沒當回事,在改動過程中才意識到其重要性,故記錄下來。
依照需求,系統應該實現例如以下的功能:有三個關聯的頁面a.aspx(簡稱a),b.aspx(簡稱b),,c.aspx(簡稱c),當中a頁面主要是進行因子錄入,所有錄入后點擊“模型檢驗”,進入b頁面,b頁面中存在兩個button,各自是“模型調整”和“取消”,點擊“模型調整”進入c頁面,點擊“取消”返回錄有數據的a頁面。c頁面存在兩個button,各自是“模型確認”和“取消”。點擊“取消”,返回到b頁面。
而bug的大概意思就是:先在b頁面點擊“模型調整”進入c頁面,再在c頁面點擊“取消”,返回到b頁面。最后,在b頁面點擊“取消”,理論上應該直接返回到錄有數據的a頁面,但此時卻須要點擊兩次“取消”才干夠實現。
細致看頁面,前台寫的方法是window.history.back(),若要這樣的方法實現理論上的效果,僅僅能是在b頁面存在一個“取消”button,或者僅僅點擊“取消”button。否則就會出現bug中的問題。
我在網上找答案,可是其給出的答案不可以直接應用,我做了一些改動,終於可以實現預期效果,代碼例如以下:
前台,<a href="#" id="alink" runat="server"><img src="qx.jpg" border="0"></a>
后台,在page_load()中寫入例如以下代碼:
string sKey = Request.Url.LocalPath;
HttpCookie cookfrom = Request.Cookies[sKey];
if (cookfrom == null)
{
cookfrom = new HttpCookie(sKey);
}
string sTimes = "0 ";
if (IsPostBack)
{
sTimes = cookfrom["count "];
sTimes = (Convert.ToInt32(sTimes) + 1).ToString();
}
cookfrom["count "] = sTimes;
Response.Cookies.Add(cookfrom);
int iTimes = (GetPageRequestTimes()) * -1;
this.alink.Attributes.Add("onclick ", "javascript:window.history.go( " + iTimes.ToString() + "); ");
當中,GetPageRequestTimes()方法例如以下:
public static int GetPageRequestTimes()
{
string sKey = System.Web.HttpContext.Current.Request.Url.LocalPath;
HttpCookie cookfrom = System.Web.HttpContext.Current.Response.Cookies[sKey];
string sTimes = cookfrom["count "];
if (sTimes.Length > 0)
{
return Convert.ToInt32(sTimes) + 1;
}
else
{
return 0;
}
}
在網上,另一種方法例如以下,只是看跟帖的人說“假設直接右鍵刷新就不起作用了”,我個人在改動時並沒有採用這樣的方法,所以並不太了解,僅僅是作為一種參考放在這里,以免丟失。代碼例如以下:
假設button的ID是LinkButton1
protected void Page_Load(object sender, EventArgs e)
{
int x=0;
if (ViewState[ "x "]!=null)
{
x=(int)ViewState[ "x "];
}
x++;
ViewState[ "x "]=x;
this.LinkButton1.Attributes.Add( "onclick ", "window.history.go(- "+x+ "); return false ");
}
注意:無論是window.go()還是window.back(),都僅僅能適用於父頁面與子頁面在同一個框架里,即子頁面不是單獨彈出的。