2011-04-13 19 views
12

Actualmente estoy teniendo un extraño problema por el cual todos los navegadores, excepto de Google Chrome, están registrando una llamada a IsPostback dentro de un evento Page_Load como verdadero cuando hago clic en un botón asp.net que simplemente se publica en la misma página.¿Cómo funciona IsPostback técnicamente?

Esto me ha llevado a intentar descubrir cómo se implementa técnicamente la propiedad IsPostback dentro de una página ASP .NET, algo que estoy luchando por encontrar.

Lo que pienso a la fecha es que podría estar relacionado con lo siguiente;

  • El tipo VERB de solicitud es POST en lugar de GET.
  • La entrada oculta que contiene la información de Viewstate no tiene información presente y, por lo tanto, no hay información de control enviada previamente disponible.
  • El refere de http en los encabezados de solicitud es el mismo que el URL actual.

¿Alguien puede proporcionar un desglose real de las condiciones utilizadas para determinar la propiedad booleana IsPostback?

Nota: Estoy buscando la implementación real en lugar de percepciones/teoría, ya que espero utilizar esto para resolver un problema activamente. También busqué en MSDN y hasta la fecha no puedo encontrar ningún artículo técnico que cubra exactamente el mecanismo.

Gracias de antemano, Brian.

Respuesta

13

La página busca la existencia de un valor de formulario __PREVIOUSPAGE.

De 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); 
    } 
} 
+0

Gracias por la salida reflejada, upvoted. Sin embargo, supongo que todavía estoy buscando una descripción más definitiva pero de nivel más alto. Esto me muestra la implementación real de la propiedad, pero no proporciona conocimiento de cómo ASP .Net interactúa con la solicitud del navegador para determinar IsPostback. Un ejemplo es "this._pageFlags [8]", ¿qué significa esto particularmente en términos del mecanismo general? –

+0

He agregado comentarios. –

+0

Fantástico, gracias por eso. Aprecie el tiempo que tanto usted como Prescott han tomado. –

4

devolución de datos realmente funciona de manera bastante simple mediante la presentación del formulario para sí mismo (en su mayor parte). El código JavaScript es en realidad puso en su página:

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

Marcas respuesta que muestra el código del lado del servidor que se ejecuta.

+0

Gracias, eso ayuda un poco más con mi comprensión. –

1

Es devolución de datos se implementa como tal (con 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); 
} 

Así que a menos que tome en cuenta todos estos parámetros, no será posible determinar.

Cuestiones relacionadas