Как технически работает IsPostback? - PullRequest
13 голосов
/ 13 апреля 2011

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

Это побудило меня попытаться выяснить, как технически реализовано свойство IsPostback на странице ASP .Net, и я пытаюсь найти это.

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

  • Тип запроса VERB - это POST, а не GET.
  • Скрытый ввод, содержащий информацию Viewstate, не содержит никакой информации, и поэтому ранее представленная управляющая информация недоступна.
  • Ссылка http в заголовках запроса совпадает с текущим URL.

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

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

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

Ответы [ 3 ]

13 голосов
/ 13 апреля 2011

Страница ищет наличие значения формы __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);
    }
}
4 голосов
/ 13 апреля 2011

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();
    }
}

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

1 голос
/ 13 апреля 2011

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

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

...