13

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

这使我尝试发现 ASP .Net 页面中的 IsPostback 属性是如何在技术上实现的,这是我正在努力寻找的东西。

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

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

谁能提供用于确定 IsPostback 布尔属性的条件的实际细分?

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

在此先感谢,布赖恩。

4

3 回答 3

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);
    }
}
于 2011-04-13T14:11:20.547 回答
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();
    }
}

Marks answer 向您显示正在运行的服务器端代码。

于 2011-04-13T14:12:42.760 回答
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);
}

因此,除非您考虑所有这些参数,否则无法对其进行跟踪。

于 2011-04-13T14:15:19.477 回答