¿Por qué las cajas de texto conservan sus datos durante el postback incluso si el viewstate está desactivado?
He visto un montón de confusión en diversos foros, de cómo y por qué una caja de texto mantiene sus datos incluso cuando los viewstate están desactivados. Aunque estaba confundido antes, traté de descubrirlo y he encontrado la razón, así que estoy compartiéndola con ustedes.
Para ello, primero vamos a ver el ciclo de vida de la página con postback.
Ahora vamos a hablar primero sobre el viewstate, ¿cómo funciona el viewstate?
Si el viewstate es el de cualquier control, durante LoadViewState, el dato viewstate que se guardó por última vez, se rellena en el control. Y al último, el método SaveViewState de todos los controles que forman parte de la jerarquía del control, se invocan y se combinan en el viewstate de todos los controles codificados en base64 y guardados.
Así como sabemos, que la página se vuelve a crear cada vez que la página hace un viaje al servidor, la persistencia de los datos se realiza con la ayuda del viewstate.
Ahora aquí está el punto que vamos a discutir, incluso si desactivamos el viewstate de algunos controles como la caja de texto, casilla de verificación, etc… los datos persisten durante el postback.
Vamos a hablar de ello en pequeño detalle, cada vez que se envía una página o se hace postback al servidor, los datos del formulario completo se envían al servidor como una colección con la solicitud. La colección está en el formulario como la colección NamedValue y esta colección tiene el mapeo con UniqueID del control y el valor del control. Puede leer los datos de la colección del formulario mediante el siguiente fragmento de código:
// Lectura del valor de la caja de texto desde la colección del formulario. string textboxvalue = Request.Form[textbox1.UniqueID];
ASP.NET utiliza esta primitiva para actualizar el valor del control. ASP.NET utiliza IPostBackDataHandler para los controles que cargan los datos de la colección del formulario.
En realidad todos los controles que implementan IPostBackDataHandler, implementan el método LoadPostData y RaisePostDataChangedEvent. Pero aquí, el método clave es LoadPostData, que devuelve true si el valor publicado se modifico desde el valor anterior y lo actualiza con el valor publicado, si no devuelve false. Vamos a ver el código de ejemplo aquí:
public virtual bool LoadPostData(string uniqueId, NameValueCollection postedCollection) { //Consigue el valor actual String currentValue = this.Text; //Consigue el valor publicado desde la coleccion del formulario String postedValue = postedCollection[uniqueId]; //Verificar si el valor publicado en diferente del valor actual, //si es si entonces actualiza con el valor publicado y retorna true if (currentValue == null || !currentValue.Equals(postedValue)) { this.Text = postedValue; return true; } //de lo contrario retorna false return false; }
A partir del ciclo de vida de la página, podemos ver que LoadPostData es invocado después de LoadViewState, aunque este activado el viewstate o no, se rellena a partir de los datos publicados. Es por eso que los datos que recibe, se mantienen aunque el estado del viewstate está desactivado para unos pocos controles. Lo que sigue es la lista completa de los controles que implementan IPostBackDataHandler.
- CheckBox
- CheckBoxList
- DropDownList
- HtmlInputCheckBox
- HtmlInputFile
- HtmlInputHidden
- HtmlInputImage
- HtmlInputRadioButton
- HtmlInputText
- HtmlSelect
- HtmlTextArea
- ImageButton
- ListBox
- RadioButtonList
- TextBox
Creo que esto debe de haber ayudado a muchos a superar esta imagen borrosa.
Entradas relacionadas