Как IsPostback технически работает?
В настоящее время у меня странная проблема, при которой все браузеры, кроме Google Chrome, регистрируют вызов IsPostback в событии Page_Load как истинный, когда я нажимаю кнопку asp.net, которая просто отправляется обратно на ту же страницу.
Это привело меня к тому, чтобы выяснить, как технически реализовано свойство IsPostback на ASP.NET-странице, что-то, что я пытаюсь найти.
Мои мысли на сегодняшний день состоят в том, что они могут быть связаны со следующим:
- Тип запроса VERB - это POST, а не GET.
- Скрытый ввод, содержащий информацию Viewstate, не содержит информации, и поэтому ранее не была предоставлена управляющая информация.
- HTTP-референт в заголовках запросов совпадает с текущим URL-адресом.
Может ли кто-нибудь предоставить фактическое разбиение условий, используемых для определения логического свойства IsPostback?
Примечание. Я ищу фактическую реализацию, а не восприятие/теорию, поскольку я надеюсь использовать ее для активного решения проблемы. Я также искал MSDN и на сегодняшний день не могу найти техническую статью, которая точно покрывает механизм.
Спасибо заранее,
Брайан.
Ответы
Ответ 1
На странице отображается значение формы __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);
}
}
Ответ 2
Postback фактически работает довольно просто, отправив форму себе (по большей части). Код 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();
}
}
Отметки ответят на ваш серверный код, который запускается.
Ответ 3
Является ли 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);
}
Поэтому, если вы не учтете все эти параметры, его невозможно будет проследить.