Как технически работает IsPostBack?

#asp.net #http-headers #httpverbs #ispostback

#asp.net #http-заголовки #http-глаголы #ispostback

Вопрос:

В настоящее время у меня странная проблема, из-за которой все браузеры, кроме Google Chrome, регистрируют вызов IsPostBack в событии Page_Load как true, когда я нажимаю asp.net кнопка, которая просто отправляет обратно на ту же страницу.

Это привело меня к попытке выяснить, как работает свойство IsPostBack в ASP.Сетевая страница технически реализована, что я изо всех сил пытаюсь найти.

На сегодняшний день я думаю, что это может быть связано со следующим;

  • Тип ГЛАГОЛА запроса — POST, а не GET.
  • Скрытый ввод, содержащий информацию о состоянии просмотра, не содержит никакой информации, и, следовательно, ранее отправленная управляющая информация недоступна.
  • Ссылка http в заголовках запроса совпадает с текущим URL.

Кто-нибудь может предоставить фактическую разбивку условий, используемых для определения логического свойства IsPostBack?

Примечание: Я ищу фактическую реализацию, а не восприятие / теорию, поскольку я надеюсь использовать это для активного решения проблемы. Я также искал в MSDN и на сегодняшний день не могу найти ни одной технической статьи, точно описывающей механизм.

Заранее спасибо, Брайан.

Ответ №1:

Страница ищет наличие __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) 
                    amp;amp; !(base.GetType() != this.Context.Handler.GetType())))
                amp;amp; !this._fPageLayoutChanged);
    }
}
  

Комментарии:

1. Спасибо за отраженный результат, поддержано. Я полагаю, что я все еще ищу более точное описание более высокого уровня. Это показывает мне фактическую реализацию свойства, но не дает знаний о том, как работает ASP. Net взаимодействует с запросом браузера, чтобы определить IsPostBack. Примером может служить «this._pageFlags[8]», что это конкретно означает с точки зрения общего механизма?

2. Фантастика, спасибо за это. Цените время, потраченное вами и Прескоттом.

Ответ №2:

Обратная отправка на самом деле работает довольно просто, отправляя форму самой себе (по большей части). Код 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();
    }
}
  

Ответ Marks показывает выполняемый код на стороне сервера.

Комментарии:

1. Спасибо, это немного больше помогает моему пониманию.

Ответ №3:

Is 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) amp;amp; !(base.GetType() != this.Context.Handler.GetType()))) amp;amp; !this._fPageLayoutChanged);
}
  

Итак, если вы не примете во внимание все эти параметры, отследить это будет невозможно.