讓Chrome瀏覽器支援Asp.Net的MaintainScrollPositionOnPostback
MaintainScrollPositionOnPostback 是在web.config設定或page宣告裏設定,讓表單postback後,就算是頁面太長,也可以停留在原本的位置,簡單說就是去紀錄Scrollbar的座標,換頁後塞回來。
最近在測試跨瀏覽器,發現這參數在Chrome裏竟然沒有效果,「唉~ 又是IE only 嗎!!」,一開始的想法是這樣啦,不過當拿出firefox測試時又OK。看了一下用Chrome下網頁的原始碼,是相關的script並沒有註冊在頁面,我有了可能是Chrome太新asp.net無法判斷的想法。
- 首先當然是google一下囉,用asp.net chrome當關鍵字。前幾筆文章就有提到 asp.net 的 Menu控制項在Chrome的顯示問題,並使用加入 .browser的方式解決,或許我比照辦理問題也會順便解決,但加了並沒有得到預期的效果。
<browsers> <browser id="Safari3" parentID="Safari1Plus"> <identification> <userAgent match="Safari/\d+\.\d+" /> </identification> <capture> <userAgent match="Version/(?'version'\d+\.\d+)" /> </capture> <capabilities> <capability name="browser" value="Safari3" /> <capability name="version" value="${version}" /> </capabilities> <controlAdapters> <adapter controlType="System.Web.UI.WebControls.Menu" adapterType="" /> </controlAdapters> </browser> <browser id="GoogleChrome" parentID="Safari3"> <identification> <userAgent match="Chrome/(?'version'\d+\.\d+)" /> </identification> <capabilities> <capability name="browser" value="Googlebot" /> </capabilities> </browser> </browsers - Page裏有MaintainScrollPositionOnPostBack這個屬性,設成true卻也無作用,但我還是用Reflactor反組譯一下他的程式碼
[DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden),Browsable(false)] public bool MaintainScrollPositionOnPostBack { get { if ((RequestInternal != null) && !RequestInternal.Browser .SupportsMaintainScrollPositionOnPostback) { return false; } return this._maintainScrollPosition; } set { if (this._maintainScrollPosition != value) { this._maintainScrollPosition = value; if (this._maintainScrollPosition) { this.LoadScrollPosition(); } } } }
至少看出來,應該是RequestInternal.Browser.SupportsMaintainScrollPositionOnPostback在做怪 - 點了HttpCapabilitiesBase.SupportsMaintainScrollPositionOnPostback繼續追蹤,看到的是
internal bool SupportsMaintainScrollPositionOnPostback { get { if (!this._haveSupportsMaintainScrollPositionOnPostback) { this._supportsMaintainScrollPositionOnPostback = this.CapsParseBoolDefault( "supportsMaintainScrollPositionOnPostback", false); this._haveSupportsMaintainScrollPositionOnPostback = true; } return this._supportsMaintainScrollPositionOnPostback; } }看到supportsMaintainScrollPositionOnPostback這個字串時,就有.browser裏可能有地方是可以設定的,有了這樣的想法再回頭檢視.browser<capabilities>
<capability name="browser" value="Googlebot" />
</capabilities>這邊就很可疑啦,於是加了一行
<capabilities>
<capability name="browser" value="Googlebot" />
<capability name="supportsMaintainScrollPositionOnPostback" value="true" />
</capabilities>嘿,這樣就好啦,就是這麼一回事,收工囉。