我想知道如何在服务器端检测回发?通常,页面上控件的状态存储在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属性)。其中一些(并非全部)是:
- 检查当前请求是否是跨页回发,即是否是从另一个页面到当前页面的回发请求。如果是这样,则该请求将被视为回邮
- .Net呈现的每个HTML页面中都有一个__VIEWSTATEGENERATOR隐藏字段。如果在页面收到的请求中,该隐藏字段不存在,或者在验证字段内容时出现错误,则该请求不会被视为Post-back
- 如果对页面的请求是通过Server.Transfer发送的,则不会将其视为回邮。这种情况下有一个例外,如果向该页面的Server.Transfer是从该页面本身启动的,则请求将被视为回邮
- 如果自上次响应以来,当前页面的布局发生了更改,则page类将假装该请求是非post-back请求。使用从请求接收的视图状态信息来识别布局改变。每个响应中都有2个与视图状态相关的.NET隐藏字段,有助于确定布局更改。
- __视图状态生成器
- __视图状态
可以从System.Web.UI.Page.IsPostBack属性的源代码中获取更多信息
此源代码的Visual Studio解决方案也可下载