SubmitDisabledControls en ASP.NET 2.0

14/12/2006

Llevo unos días trasteando ASP.NET 2.0 y me he encontrado con un montón de problemas, funcionamientos inesperados y quebraderos de cabeza que, si bien de uno en uno son entretenidos de solucionar, todos de golpe y a cada paso que doy se hacen un poco desesperantes. Supongo que es el precio a pagar cuando uno se mete a investigar sin haberse empapado bien las especificaciones.

El último de los problemas que he solucionado y con diferencia el que más me ha costado ha sido un proeblema con los campos desactivados de un formulario. Con frecuencia se hace necesario mostrar una serie de campos en un formulario conteniendo una serie de datos pero no permitiendo que estos datos sean modificados por el usuario. Para ello se puede desactivar el campo estableciendo su atributo disabled="disabled". Pues bien, si hacemos esto, al hacer un postback del formulario al servidor los datos contenidos en los campos desactivados no se envían. Después de mucho Googlear di con el error y este se llama, como en muchos casos, especificaciones: en efecto… el estandar propone que los valores de los campos desactivados no sea enviado de vuelta al servidor en el postback.

Sin embargo, ASP.NET 2.0 provee de un mecanismo sencillo y eficaz que fuerza al navegador a enviar este tipo de campos. Realmente lo que hace es, justo antes de hacer el postback, cuando ya el usuario no puede modificar los valores, volver a activar todos los campos, logrando así que se envíen sus valores. El mecanismo en cuestión no es más que la inclusión del atributo SubmitDisabledControls en el form correspondiente. La cosa quedaría así:

<form id="form1" runat="server" SubmitDisabledControls="True">

Es un atributo que aparece en ASP.NET 2.0. Para quienes uséis ASP.NET 1.1 o anteriores deberéis buscar una forma alternativa como, por ejemplo, preparar una función javascript que, justo antes de hacer el postback/submit, vuelva a activar los controles o, o usar la propiedad ReadOnly de los INPUT en vez de Disabled o, en vez de usar controles INPUT desactivados, usar texto plano (que no es editable), etc.

EDIT: Sigue sin funcionar adecuadamente. Solución provisional: en vez de desactivar los controles con disabled="disabled" usar onfocus="this.blur();". Dejo los comentarios activados por si algún alma caritativa quiere sacarme de la ignorancia. Gracias.


2 Comentarios »

  1. Hola David, he llegado aqui buscando soluciones a este tema ya que a mi me pasa lo mismo, tengo que forzar el valor de un dropdownlist en algunos casos y no dejar que el usuario lo cambie con enabled.
    Pongo lo de submitdisabledcontrols pero en el postback retoma el primer valor del dropdownlist con lo que me trastoca todo.
    La unica solución que se me ha ocurrido es asociar un hidden al dropdownlist, de manera que al disparar selectedindexchange, cojo el valor y lo meto en ese hidden y en el postback, en lugar de tomar el valor del dropdownlist tomo el del hidden :S
    Una chapuza vamos xD
    SaLu2

    Comentado por Carlos Alvarez el día 31/01/2008 a las 11:12

  2. Hola Carlos. La que comentas es una solución ingeniosa ¿Chapuza? Hombre, a veces no nos dejan más remedio ¿no crees? :)

    Como comento al final del post, la solución del atributo “SubmitDisabledControls” tampoco me acabó funcionando a mi. Finalmente opté por desactivar los controles con javascript, haciendo onfocus=”this.blur();”. De momento (tras varios meses funcionando así) no me ha dado ningún problema.

    Gracias por aportar tu solución. Me la apunto en mi “cajón de sastre” y por aquí queda por si a alguien más le puede ayudar.

    Comentado por David el día 04/02/2008 a las 11:13

Deja tu comentario



Anti-spam measure: please retype the above text into the box provided.