天天看點

window.history.back()的改進方法window.history.go()

      今天在做項目時,測試人員提出了一條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(),都僅僅能适用于父頁面與子頁面在同一個架構裡,即子頁面不是單獨彈出的。

繼續閱讀