Existen varias maneras de mejorar el rendimiento de una aplicación web, una de las más importantes es el cacheo de datos y más concretamente, cachear imagenes.
Existen algunos escenarios en los cuales conseguir cachear los datos no es trivial, uno de ellos es cuando tenemos una imagen almacenada en una base de datos en formato BLOB, en este casi si queremos mostrar la imagen en nuestra web, una manera de hacerlo es creando un Controlador genérico (.ashx). Si hacemos esto deberemos manejar manualmente el cacheo de imagenes.
El siguiente fragmento de código muestra como habilitar la cache:
//creacion de un objeto TimeSpan que va a indicar la duración de la cache
TimeSpan freshness = newTimeSpan(0, 0, 10, 0);
//se configura el tiempo de expiración de la cache
Con la llegada Ajax debemos tener en cuenta que actualmente existen dos tipos de Postback, uno podriamos llamarlo Full Postback, en él se recarga toda la página. Con ajax surge el concepto de Partial Postback, es una ida al servidor que solo actualiza una parte de la página.
En ocasiones puede ser interesante para el control de nuestras aplicaciones si un Postaback ha sido parcial o total, para ello tendremos que obtener una instancia del ScriptManager de nuestra página a traves del método GetCurrent y comprobando el valor de la propiedad IsInAsyncPostBack.
A continuación podemos ver un ejemplo:
protectedvoid Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
//Se obtiene comprueba la propiedad IsInAsyncPostBack
if (ScriptManager.GetCurrent(this.Page).IsInAsyncPostBack)
En muchas ocasiones en nuestras aplicaciones definimos enumerados para hacer un manejo mas eficiente de los datos, muchas veces queremos mostrarlos en un combo para que el usuario seleccione. Para hacer esto podemos enlazar el enumerado al control DropdownList
public enum MiEnumerado
{Lunes,Martes,Miercoles}
MiDropDownList.DataSource = Enum.GetNames(typeof(MiEnumerado));
MiDropDownList.DataBind();
Para acceder al valor seleccionado podriamos hacerlo de la siguiente manera:
MiEnumerado miEnun = (MiEnumerado)Enum.Parse(typeof(MiEnumerado),MiDropDownList.SelectedValue);
De esta forma tenemos el valor seleccionado en forma de enumerado nuevamente.
En algunas ocasiones nos gustaria saber control ha provocado la recarga (postback) de la página para esto podemos hacerlo de dos formas dependiendo de si es una recarga parcial (ajax) o un postaback total de la pagina.
1.-Si es una recarga parcial de la pagina
//obtenemos la página actual
Page page = (HttpContext.Current.Handler as Page);
//mediante el Scriptmanager accedemos al control que ha hecho la recarga parcial de la misma
string ctrlname = ScriptManager.GetCurrent(page).AsyncPostBackSourceElementID;
Control control = page.FindControl(ctrlname);
2.-Si es una recarga total
ctrlname = page.Request.Params["__EVENTTARGET"];
Esto funciona conrrectamente con casi todos los controles pero No con Botones, esto es debido a que los botons cuando se pintan en html no llaman a la función __doPostBack de Javascript y por tanto __EVENTTARGET nunca va a tener valor, para conseguir esto os dejo un enlace en el que muestran como conseguirlo para todo tipo de controles. Es un articulo muy útil de Ryan Farely.
Después de pasar un buen rato trabajando con el control Treview de asp.net (la version 2.0 del control, con la uno este problema no existe) me surgio un problema que con el que no contaba, el árbol que yo estaba generando no hacia postback cuando se producia un click en uno de los nodos, este que a priori no deberia suponer un problema, lo es cuando queremos personalizar el estilo del nodo seleccionado, en esta situación no se aplicaba el estilo. Esto se puede hacer de forma declarativa medienta las propiedades SelectNodeStyle.
<"asp:treeview id="arbolListines" runat="server" backcolor="Aqua" bordercolor="Black" bold="true" >
Para que el estilo sea reconocido de forma correcta debemos añadir la siguiente propiedad al control Treeview:
Target="_self"
De esta forma conseguiemos que funcione correctamente.
Un pequeño problema a la hora de usar las MasterPage es que al introducir controles dentro de los ContentPlaceHolder, el ClientId de estos controles aparece modificado, se le añade un prefijo con el nombre de su contenedor (ContentPlaceHolder). Esto solo nos afecta si queremos acceder a estos controles desde el cliente (javascript) . Un ejemplo seria un TextBox con el Id = txtNombre, este apareceria en nuestro codigo html como
ctl00_ContentPlaceCuerpoPagina_txtNombre
La solución fácil seria acceder usando el nombre completo
document.getElementById("ctl00_ContentPlaceCuerpoPagina_txtNombre").valueEsto seria poco elegante y ademas peligroso, ya que si en algun momento se cambia el nombre
del ContentPlaceHolder,esa sentencia ya no seria valida. Una forma efectiva de acceder al control seria.
document.getElementById('<%=txtNombre.ClientID %>').value