Como funciona o IsPostback tecnicamente?

No momento, estou tendo um problema estranho, no qual todos os navegadores, exceto do Google Chrome, registram uma chamada para IsPostback em um evento Page_Load como verdadeiro quando clico em um botão asp.net que simplesmente volta para a mesma página.

Isso me levou a tentar descobrir como a propriedade IsPostback em uma página ASP .Net é tecnicamente implementada, algo que estou tentando encontrar.

Meus pensamentos até o momento são de que isso poderia estar relacionado ao seguinte;

  • O tipo VERB da solicitação é POST em vez de GET.
  • A input oculta que contém as informações do Viewstate não tem nenhuma informação presente e, portanto, nenhuma informação de controle enviada anteriormente está disponível.
  • O referenciador HTTP nos headers de solicitação é o mesmo que o URL atual.

Alguém pode fornecer um detalhamento real das condições usadas para determinar a propriedade booleana IsPostback?

Observação: estou procurando a implementação real em vez de percepções / teoria, pois espero usar isso para resolver ativamente um problema. Eu também pesquisei no MSDN e, até hoje, não consigo encontrar nenhum artigo técnico cobrindo o mecanismo com precisão.

Obrigado antecipadamente, Brian.

A página procura a existência de um valor de formulário __PREVIOUSPAGE .

Do refletor:

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

Postback realmente funciona de forma bastante simples, enviando o formulário para si (na sua maior parte). O código javascript é colocado na sua página:

   function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } 

Marks answer mostra o código do lado do servidor que é executado.

O Postback é implementado como tal (usando o 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); } 

Portanto, a menos que você leve em conta todos esses parâmetros, não será possível rastreá-lo.

    Intereting Posts