2011-04-13 69 views
12

我目前有一個奇怪的問題,除了谷歌瀏覽器之外的所有瀏覽器都在Page_Load事件中註冊了對IsPostback的調用,因爲當我點擊一個簡單地回發到同一頁面的asp.net按鈕時,它就是true。IsPostback在技術上如何工作?

這導致我嘗試發現ASP.Net頁面中的IsPostback屬性在技術上是如何實現的,這是我努力尋找的。

我的想法迄今爲止它可能與以下有關;

  • 請求VERB類型是POST而不是GET。
  • 包含Viewstate信息的隱藏輸入信息不存在,因此以前未提交的控制信息不可用。
  • 請求標頭中的http referer與當前URL相同。

任何人都可以提供用於確定IsPostback布爾屬性的條件的實際細分?

注意:我正在尋找實際的實現而不是理解/理論,因爲我希望能夠用它來積極解決問題。我也搜索了MSDN,並且迄今爲止找不到任何精確覆蓋該機制的技術文章。

在此先感謝, 布賴恩。

回答

13

頁面查找__PREVIOUSPAGE表單值的存在。

從反射:

public bool IsPostBack 
{ 
    get 
    { //_requestValueCollection = Form or Querystring name/value pairs 
     if (this._requestValueCollection == null) 
     { 
      return false; 
     } 

     //_isCrossPagePostBack = _requestValueCollection["__PREVIOUSPAGE"] != null 
     if (this._isCrossPagePostBack) 
     { 
      return true; 
     } 

     //_pageFlags[8] = this._requestValueCollection["__PREVIOUSPAGE"] == null 
     if (this._pageFlags[8]) 
     { 
      return false; 
     } 

     return ( ((this.Context.ServerExecuteDepth <= 0) 
       || ( (this.Context.Handler != null) 
        && !(base.GetType() != this.Context.Handler.GetType()))) 
       && !this._fPageLayoutChanged); 
    } 
} 
+0

感謝您的反饋輸出,upvoted。我想我仍然在尋找更明確但更高層次的描述。這向我顯示了實際的屬性實現,但並未提供ASP .Net如何與瀏覽器請求交互以確定IsPostback的知識。一個例子是「this._pageFlags [8]」,這對於整體機制來說尤其意味着什麼? – 2011-04-13 14:14:07

+0

我添加了評論。 – 2011-04-13 14:32:17

+0

太棒了,謝謝你。欣賞你和普雷斯科特所採取的時間。 – 2011-04-13 14:39:07

4

回發實際上通過提交表單本身(大部分)的工作原理相當簡單。 javascript代碼實際上已放在您的頁面上:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> 
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> 

function __doPostBack(eventTarget, eventArgument) { 
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
     theForm.__EVENTTARGET.value = eventTarget; 
     theForm.__EVENTARGUMENT.value = eventArgument; 
     theForm.submit(); 
    } 
} 

標記答案顯示您運行的服務器端代碼。

+0

謝謝,這對我的理解有所幫助。 – 2011-04-13 14:25:40

1

是回發是這樣(使用反射)來實現:

public bool get_IsPostBack() 
{ 
    if (this._requestValueCollection == null) 
    { 
     return false; 
    } 
    if (this._isCrossPagePostBack) 
    { 
     return true; 
    } 
    if (this._pageFlags[8]) 
    { 
     return false; 
    } 
    return (((this.Context.ServerExecuteDepth <= 0) || ((this.Context.Handler != null) && !(base.GetType() != this.Context.Handler.GetType()))) && !this._fPageLayoutChanged); 
} 

所以,除非你考慮到所有這些參數,將無法對其進行跟蹤。