2017-10-21 123 views
0

用於從代碼隱藏中觸發JavaScript代碼的代碼段(,C#)爲:瀏覽器後退按鈕顯示服務器發送的保留頁面狀態,但使用javascript完成的任何DOM修改未得到保留

int returnValue = SaveStudent("John", "XII"); // SaveStudent() is a C# function that saves the student details in DB and returns studentId. 
hdnStudentId = returnValue ; // hdnStudentId is a hidden-field control 
ScriptManager.RegisterStartupScript(this, this.GetType(), 
          "ShowStudent", "showStudentDetails();",true); 

的定義 「showStudentDetails()」 JavaScript方法是:

function showStudentDetails(){ 
    If($('[id*=hdnStudentId]').val() > 0){ 
     // show the popup 
    } 
} 

這裏是問題的說明:

  • 在網頁「WebPage1.APSX」中,將數據保存到數據庫之後,我使用ScriptManager類(如上所述)顯示 引導彈出窗口。

  • 這裏我設置了插入rowid 隱藏字段變量的值插入數據庫(比如12345)。

  • ScriptManager類 成功在DOM中註冊腳本並顯示彈出窗口。

  • 此後,我將Here hidden-field變量重置爲-1。在 彈出窗口中,我有一個按鈕控件,該按鈕控件重定向到另一頁 'WebPage1.APSX'。 ('[id * = hdnStudentId]')。val(' - 1');

  • 現在,用戶點擊'瀏覽器後退按鈕',它不會觸及服務器端代碼,並且會根據服務器發送的先前頁面實例呈現UI。

  • 由於這是網頁的前一個實例的服務器,隱場 變量被設置爲「12345」,而不是-1(不知道爲什麼,我們已經 並重置爲-1值)發送和顯示再次彈出。

要求:當用戶點擊 '瀏覽器的後退按鈕',我們需要記住在DOM以前處理過的數據,以及(即$( '[ID * = hdnStudentId]')VAL(。 '-1');),以便我們可以避免在瀏覽器後退按鈕單擊時顯示彈出窗口。

+0

嗨民間,請回復。我會很感激你! –

回答

1

您需要結賬瀏覽器歷史記錄API來保存時沒有服務器所涉及的歷史你的頁面狀態,這裏是MDN文檔https://developer.mozilla.org/en-US/docs/Web/API/History_API

的DOM window對象通過 的history對象訪問瀏覽器的歷史。它暴露了有用的方法和讓你 來回移動通過用戶的歷史,以及性能 - 與HTML5開始 - 操縱歷史堆棧

,也阿賈克斯的導航的例子的內容https://developer.mozilla.org/en-US/docs/Web/API/History_API/Example。希望有所幫助!

+0

謝謝..這真的是一個好主意,但我在多個網頁(大約10個.aspx頁面)中實現它時遇到了一些問題。 所以,我試圖把它保存在MasterPage中。但在獲取上一頁時遇到問題。 **問題:**點擊頁面鏈接時,上一頁是「以前存在」頁面,但在頁面上刷新也會加載上一頁。而且,瀏覽器上顯示的URL也會錯誤地更改。 母版頁的代碼片段被放置在下一個評論中,因爲'這個回覆的字符數很長'。 –

+0

這裏是母版頁的代碼段: 代碼被註釋掉,因爲這些代碼不能按預期工作: //history.pushState(null,null,document.referrer); window.addEventListener(如 'popstate',函數(事件){ //history.pushState(null,NULL,document.referrer); //history.pushState(null,NULL,window.location.href); 警報('嗨,你點擊瀏覽器後退按鈕'); }); –

+0

您是否認爲這可能是由於將'pushState()'的動態引用傳遞給了我不推薦傳遞像'document.referrer'或'window.location.href'這樣的動態參數。我想最好這樣做,'var stateObj = {id:hdnStudentId}; history.pushState(stateObj,null,「#popup」); URL後面的'#'是僅供客戶端使用的JS的一般模式。然後在你的事件監聽器中,你可以調用函數'showStudentDetails(stateObj.id)',這意味着擴展你的函數來接受參數。 –

0

謝謝@薩魯斯..我跟着你的勸告..最後下面的代碼片段爲我工作.. 我用'歷史。pushState的();」方法剛剛顯示彈出後:

$('#divStudentDetails').modal('show'); 
history.pushState(null, null, ""); 
相關問題