如何在webform的服务器端检测到回发

时间:2016-04-14 23:17:55

标签: c# asp.net

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

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

3 个答案:

答案 0 :(得分:0)

在ASP.NET的上下文中,首页加载是HTTP GET请求,之后它们是POST请求。

Similar question here.

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

答案 1 :(得分:0)

有点复杂。 System.Web.UI.Page的权重大约为6500行,具有众多公共/内部依赖关系。

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

来自您之前的评论:

  

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

您使用隐藏字段是正确的。 IrishChieftain在指出HTTP动词用于判断时也是正确的。

整个过程是无国籍的。

Page通过一系列步骤来做出决定。

Starting with 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;
    }
}

答案 2 :(得分:0)

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

  1. 检查当前请求是否是跨页回发,即是否是来自其他页面的当前页面的发布请求。如果是这样,请求将被视为回发。
  2. .Net呈现的每个HTML页面中都有一个__VIEWSTATEGENERATOR隐藏字段。如果在页面收到的请求中,此隐藏字段不存在,或者在验证字段内容时出现错误,则请求不会被视为回发。
  3. 如果对页面的请求是通过Server.Transfer进行的,则不会将其视为回发。这种情况有一个例外,如果此页面的Server.Transfer是从此页面本身启动的,那么请求将被视为回发。
  4. 如果当前页面的布局自上次响应后已更改,则Page类将假装该请求是非回发请求。使用从请求接收的视图状态信息来标识布局更改。每个响应中有2个与视图状态相关的.NET隐藏字段,这有助于确定布局更改。
    • __ VIEWSTATEGENERATOR
    • __ VIEWSTATE
  5. 可以从source code for System.Web.UI.Page.IsPostBack属性

    获取更多信息

    此源代码的Visual Studio解决方案也适用于download