如何在Web表单的服务器端检测Postback



我想知道如何在服务器端检测回发?通常,页面上控件的状态存储在Viewstate中,它们在每次回发到服务器时来回遍历。由于http是无状态的,服务器将如何区分postback ed页面和初始页面加载。

我们可以使用Page.IsPostback属性,该属性分别为回发和初始加载自动设置为true或false。但我的问题是,是什么控制了对Page.Ishpostback属性的true和false赋值,以及服务器如何计算表单postback?服务器是否使用任何隐藏字段来检测页面的回发?

在ASP.NET的上下文中,第一个页面加载是HTTP GET请求,之后是POST请求。

这里有类似的问题。

从技术上讲,第一个页面可以作为POST,但这不是典型的。

这有点复杂。System.Web.UI.Page大约有6500行,具有许多公共/内部依赖关系。

http://referencesource.microsoft.com/#System.Web/UI/Page.cs

根据您之前的评论:

正如我们预期的那样,客户端向服务器发送一些隐藏字段检测回发,并基于此将IsPostback设置为true。

使用隐藏字段是正确的。IrishChieftain也正确地指出,在确定中使用了HTTP动词。

整个过程是无状态的。

CCD_ 3通过多个步骤进行确定。

从ProcessRequestMain()开始:

  • 检查页面是否使用PageAdapter
  • 调用PageAdapter's DeterminePostBackMode()方法,或者在页面本身调用DeterminePostBackMode()
  • 。。。它调用GetCollectionBasedOnMethod()
  • 请求是POST吗?尝试返回Request.Form集合
  • 我们有GetCollectionBasedOnMethod()的藏品吗?如果是,请检查某些隐藏字段
  • 检查跨页回发,并相应地设置_pageFlags[isCrossPagePostRequest]

这些似乎是调用IsPostBack所必需的先决条件。

public bool IsPostBack {
    get {
        if (_requestValueCollection == null)
            return false;
        // Treat it as postback if the page is created thru cross page postback.
        if (_isCrossPagePostBack)
            return true;
        // Don't treat it as a postback if the page is posted from cross page
        if (_pageFlags[isCrossPagePostRequest])
            return false;
        // Don't treat it as a postback if a view state MAC check failed and we
        // simply ate the exception.
        if (ViewStateMacValidationErrorWasSuppressed)
            return false;
        // If we're in a Transfer/Execute, never treat as postback (ASURT 121000)
        // Unless we are being transfered back to the original page, in which case
        // it is ok to treat it as a postback (VSWhidbey 117747)
        // Note that Context.Handler could be null (VSWhidbey 159775)
        if (Context.ServerExecuteDepth > 0 &&
            (Context.Handler == null || GetType() != Context.Handler.GetType())) {
            return false;
        }
        // If the page control layout has changed, pretend that we are in
        // a non-postback situation.
        return !_fPageLayoutChanged;
    }
}

System.Web.UI.Page类使用各种方法来检查当前请求是否为post-back(设置IsPostBack属性)。其中一些(并非全部)是:

  1. 检查当前请求是否是跨页回发,即是否是从另一个页面到当前页面的回发请求。如果是这样,则该请求将被视为回邮
  2. .Net呈现的每个HTML页面中都有一个__VIEWSTATEGENERATOR隐藏字段。如果在页面收到的请求中,该隐藏字段不存在,或者在验证字段内容时出现错误,则该请求不会被视为Post-back
  3. 如果对页面的请求是通过Server.Transfer发送的,则不会将其视为回邮。这种情况下有一个例外,如果向该页面的Server.Transfer是从该页面本身启动的,则请求将被视为回邮
  4. 如果自上次响应以来,当前页面的布局发生了更改,则page类将假装该请求是非post-back请求。使用从请求接收的视图状态信息来识别布局改变。每个响应中都有2个与视图状态相关的.NET隐藏字段,有助于确定布局更改。
    • __视图状态生成器
    • __视图状态

可以从System.Web.UI.Page.IsPostBack属性的源代码中获取更多信息

此源代码的Visual Studio解决方案也可下载

最新更新