asp.net關於強制回應視窗重新整理問題__.net
來源:互聯網
上載者:User
問題描述:
在實際運用中,我們在a.aspx頁面需要開啟一個新視窗(為描述方便,假定為b.aspx),在新視窗關閉之前,需要禁用a.aspx頁面。b.aspx裡面觸發有相應的事件,當事件觸發的時候,同時應該更新b.aspx.
解決方案:
這時我們最好的選擇是用強制回應視窗開啟b.aspx,即showModalDialog(b.aspx).
如果直接用強制回應視窗開啟b.aspx頁面,如果b.aspx僅僅是textbox、dropdownlist之類的運行在伺服器端的文本控制項(這些控制項本身也不能觸發對應的事件),返回這些控制項的值不會出什麼問題,但是如果要有伺服器端button之類調用cs裡面的方法,或者本身會觸發事件,就會出問題。當觸發這些方法,就會將強制回應視窗開啟的頁面做為一個頁面彈出(本例也就是b.aspx)。強制回應視窗裡面是不能重新整理的,所以這些事件如果要更新當前強制回應視窗裡面的頁面內容,是不可能的。
這中機制是沒辦法改變的,觸發了相應的事件,就會重新載入一次頁面(觸發了Page_Load事件),即使IsPostBack是false.
這種情況下該怎麼做才能達到預定的目的?
我們不妨試試這種方法:用架構進行操作。說簡單點:建立一個新頁面(c.aspx),只做架構支撐。對應子幀指向指定的頁面(b.aspx)。這樣我們在a.aspx頁面裡用強制回應視窗開啟c.aspx,就達到預定的效果了。b.aspx頁面可以有任何觸發事件進行更新頁面的內容。同時如果要傳值,就需要先傳值到架構頁面,然後再傳到既定的頁面。這種方法的由來是參考了同事的做法,本人覺得這種方法很簡便,不需要有太多的考慮。操作起來相對來說最容易。
第二種方法我們就需要有ajax方面的知識了。這種做法需要注意的是同樣不能夠觸發到本頁面的事件,否則就會自動彈出強制回應視窗裡面的頁面(沒有頁面支撐的情況下)。這種方式下我們需要藉助第三個aspx頁面來進行相應的事件操作處理,然後返回操作結果以更新(更新而不是重新整理)強制回應視窗裡面的內容。這種方式的難度要比第一種方法大,不好操作。尤其是強制回應視窗裡面控制項涉及到資料繫結的時候,更不好操作。
第三種方法本人沒操作成功。大致思想:用window.open()方法開啟b.aspx頁面,b.aspx頁面載入的時候,將a.aspx裡面所有的控制項都禁用掉,同時也要將a.aspx頁面的重新整理功能關閉掉(shift+F10,F5,右鍵,瀏覽器本身的重新整理按鈕),當b.aspx頁面關閉的時候,傳入一個參數到a.aspx頁面,直到該參數值為真的時候,再釋放所有禁用的資源。在實際操作中,open()方法開啟b.aspx頁面後禁止重新整理a.aspx頁面遇到了問題。在b.aspx頁面的window.onload=funciton(){}添加opener.document.oncontextmenu="return false",達不到禁用右鍵
opener.document.onkeydown=function(){if(event.keyCode==116) event.keyCode=0;event.returnValue=false;}調用對應的事件也禁止不了F5鍵。
當初也懷疑是這些事件寫的有問題,就直接把這些事件放在一個單獨的一個頁面做測試,一旦到測試頁面的時候,這些都是正確的:禁掉了F5和右鍵。回到用open()開啟b.aspx頁面,達不到禁用目的。後面的根本就進行不下去了,很喪氣............
第一種第二種方法都不錯,第二種方法要對ajax有一定的瞭解。至於選擇哪種技術,則需要看個人的情況,哪種方法上手快就選那種方法。
第三種方法出現的問題,不知該如何解決....