lunes, 25 de febrero de 2008

ASP.NET 2.0 Perdiendo cambios en un TextBox ReadOnly=True entre PostBacks

Hola amigos, en esta oportunidad nos estaremos internado un poco más en lo que es ASP.NET 2.0
y les hablaré acerca de un problema recurrente por lo que he leido por ahí buscando información (y que me pasó a mi también).
Se trata del nuestro gran amigo TEXTBOX el cuál teniendo su propiedad ReadOnly en True no retiene los valores o los cambios hechos en el lado del cliente son ignorados entre Postbacks.

Entonces si intentamos modificar el valor del TextBox o agregarle un valor determinado mediante JavaScript, lamentablemente, se hace imposible rescatar ese valor en el Code Behind o simplemente ese valor se pierde en el proceso de PostBack.

Veamos un ejemplo:

declaramos un textbox

<asp:textbox id="TextBox1" runat="server" text="Texto de Ejemplo" readonly="true">


agregamos el siguiente botón

<asp:button id="Button1" runat="Server" text="Submit" onclick="Button1_Click">


el propósito de lo de arriba es de invocar un método del Code Behind, el evento Click
donde podemos generar un Response.Write del valor en el TextBox.

entonces en el Code Behind agregamos el siguiente método:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Response.Write(TextBox1.Text)

End Sub

entonces agregamos el siguiente botón:

<input type="Button" name="Button2" onclick="CambiarValor()" />

El propósito de este input type botón es el de ejecutar una rutina JavaScript en el lado
del cliente.


<script language="javascript">
function CambiarValor()
{
this.form1.TextBox1.value = "Texto
Modificando";
}

</script>

ubica este script antes del tag </head> en tu archivo aspx.

Bueno, ahora ejecuta el programa y al hacer click en el Input Type botón
veremos que el texto en el textbox cambia a "Texto Modificado"

En cambio, al hacer click en el botón Submit el cual es un <asp:button>, un Server Control,
veremos que el texto que se escribe en el TextBox es nuevamente "Texto de Ejemplo".

Esto es independiente de que tengamos habilitado la propiedad EnableViewState en el TextBox.
De hecho la propiedad EnableViewState del TextBox no hace ninguna diferencia desde que los valores del TextBox son mantenidos desde el Form's Collection y no desde el ViewState.

Pero no nos preocupemos, hay una forma de solucionar este inconveniente, en vez de asignar "ReadOnly = True" a la propiedad nosotros podemos habilitar la propiedad ReadOnly del TextBox en la Colección de Atributos en el Code Behind. Para hacer esto removamos la propiedad ReadOnly en el código de arriba, entonces en el Code Behind dentro del Page_load agrega lo siguiente:


TextBox1.Attributes.Add("readonly", "readonly")


Bueno, ahora el correr nuestra página veremos que los cambios realizados en el lado
del cliente se mantienen entre PostBacks.

Este comportamiento esta implementado en ASP.NET con la idea de que ReadOnly TextBox no sean
modificados por código malicioso en el lado del cliente.

Bueno, ahora me despido y pronto volveremos con más cositas, pequeñas, pero que a mi
en lo particular me han dado mas de un dolor de cabeza.....hasta la próxima!!!!

rodrigo77s@msn.com
desarrollador ASP.NET y VB.NET