IsPostback技术上如何工作?

13

我目前有一个奇怪的问题,除了Google Chrome浏览器外,所有浏览器在我点击asp.net按钮并简单地将页面发布到相同页面时,都会在Page_Load事件中注册对IsPostback的调用为真。

这导致我尝试发现ASP .Net页面中的IsPostback属性是如何技术实现的,但我很难找到。

迄今为止,我的想法是它可能与以下内容有关;

  • 请求VERB类型是POST而不是GET。
  • 包含Viewstate信息的隐藏输入没有任何信息,因此没有先前提交的控件信息可用。
  • 请求头中的http referer与当前URL相同。

是否有人可以提供用于确定IsPostback布尔属性条件的实际分解?

注意:我正在寻找实际实现,而不是感知/理论,因为我希望使用它来积极解决问题。 我也搜索了MSDN,但迄今为止找不到准确覆盖机制的技术文章。

提前感谢, Brian。

3个回答

13

该页面查找是否存在名为__PREVIOUSPAGE的表单值。

来自Reflector:

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);
    }
}

感谢您提供的反馈输出并点赞。虽然如此,我仍在寻找更明确但更高层次的描述。这向我展示了实际的属性实现,但并没有提供ASP .Net如何与浏览器请求交互以确定IsPostback的知识。例如,“this._pageFlags [8]”,在整个机制方面,这特别意味着什么? - Brian Scott
太棒了,谢谢你。非常感谢你和普雷斯科特花费的时间。 - Brian Scott

4

Postback的工作原理相当简单,它通过将表单提交给自身来完成(大部分情况下)。实际上,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();
    }
}

马克的回答展示了服务器端的代码,该代码会被运行。

谢谢,这有助于我更好地理解。 - Brian Scott

1

PostBack是这样实现的(使用Reflector):

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);
}

因此,除非您考虑到所有这些参数,否则将无法跟踪它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接