我目前遇到一个奇怪的问题,即当我点击一个只返回同一页面的asp.net按钮时,除了Google Chrome之外的所有浏览器都会在Page_Load事件中注册对IsPostback的调用为真。
这让我试着发现ASP .Net页面中的IsPostback属性是如何在技术上实现的,这是我很难找到的。
我的想法是,它可能与以下内容有关;
任何人都可以提供用于确定IsPostback布尔属性的条件的实际细分吗?
注意:我正在寻找实际的实现,而不是感知/理论,因为我希望用它来积极解决问题。我也搜索过MSDN,到目前为止找不到任何准确涵盖该机制的技术文章。
提前致谢, 布赖恩。
答案 0 :(得分: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);
}
}
答案 1 :(得分: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();
}
}
标记答案显示运行的服务器端代码。
答案 2 :(得分: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);
}
因此,除非您考虑所有这些参数,否则无法追踪它。