Reducir el tamaño del ViewState en un DropDownList

Si tenemos en una página en ASP .NET varios controles DrowDownList con muchos valores y necesitamos mantener el ViewState para recuperar el valor seleccionado en cada PostBack, en el ViewState se estará  almacenando la información de cada uno de los valores de cada DropDownList.

Aunque la página sea muy sencilla, el resultado de tener estos controles con el ViewState habilitado puede ser una página bastante grande y, por lo tanto, el tamaño de los datos enviados de ida y vuelta puede ser grande también.

Pero puede que no sea necesario mantener toda esta información en el ViewState, ya sea porque el contenido del desplegable sea estático, porque no nos importe reconstruir las listas en cada llamada al servidor, porque los datos para construir la lista estén cacheados, porque sea importante para nosotros el tamaño final de la página, etc.

Sin embargo, si deshabilitamos el ViewState de un control DropDownList veremos que se deja de recordar el valor seleccionado entre cada PostBack.

La solución es bastante sencilla, y consiste en recargar "manualmente" los DropDownList en cada PostBack, utilizando para ello el método Page_Init:

void CargarDropDownLists() {
   ddl1.DataSource = //Obtener lista de valores de BdD, caché, etc
   ddl1.DataBind();

   ddl2.DataSource = //Obtener lista de valores de BdD, caché, etc
   ddl2.DataBind();
}

void Page_Init() {
   CargarDropDownLists();
}

Utilizamos el método Page_Init en lugar del Page_Load, ya que este último se ejecuta después de que los valores de la propiedad "SelectedValue" sean asignados. Si probáis a utilizar el método Page_Load comprobaréis que no funciona. Sin embargo, utilizando el método Page_Init para rellenar los desplegables, todo funciona igual que si el ViewState estuviera habilitado.

No nos olvidemos de deshabilitar primero el ViewState de todos los DropDownList con la propiedad EnableViewState="False".

Mostrar ficheros ocultos en Mac OS X

Los ficheros ocultos en Mac OS X suelen ser aquellos cuyo nombre empieza por un punto, por ejemplo el famoso .gitignore.

Por defecto, Mac OS X no muestra los ficheros ocultos, y en Finder tampoco tenemos ninguna opción para modificar este comportamiento. Para ver los archivos ocultos en el Finder, tendremos que seguir algunos pasos que indico a continuación:
  1. Abrimos una ventana de Terminal.
  2. Introducimos el siguiente comando:
    defaults write com.apple.Finder AppleShowAllFiles YES
    

  3. Ahora tenemos que reiniciar el Finder para que tome los cambios. Para ello, a la vez que presionamos la tecla opción (Alt), hacemos click derecho en el icono del Finder y seleccionamos "Forzar reinicio"
Si queremos dejar de mostrar los archivos ocultos, no tenemos más que seguir los pasos anteriores pero esta vez introduciendo en el terminal el siguiente comando:

defaults write com.apple.Finder AppleShowAllFiles NO

Cómo evitar el mensaje "Para mostrar de nuevo esta página web, Internet Explorer debe volver a enviar la información..."

El problema lo podemos reproducir al recargar una página web con un formulario a través de la función location.reload() de Javascript, después de haber enviado previamente dicho formulario.

En esa situación nos encontramos con que Internet Explorer nos muestra el siguiente mensaje:

"Para mostrar de nuevo esta página web, Internet Explorer debe volver a enviar la información que ya envió anteriormente. 

Si estuviera realizando una compra, haga clic en Cancelar para evitar que la transacción se realice dos veces. De otra forma haga clic en Reintentar para volver a mostrar la página web."
Cuando se está intentando recargar la página con location.reload() en una ventana que está mostrando los resultados devueltos después de un PostBack, Internet Explorer nos previene de ello para evitar envíos de formulario duplicados.

Como el mensaje de advertencia se produce por la utilización de la función location.reload() de Javascript, para evitar que se muestre podemos hacer dos cosas:
  1. Si no necesitamos reenviar de nuevo el formulario para recuperar los datos introducidos, en lugar de location.reload() podemos utilizar location="miurl";.
  2. También podemos utilizar javascript para reenviar el formulario, por ejemplo con document.forms(0).submit();