Para un proyecto ASP.NET 2.0 que será visto desde celulares fue necesario quitar el VIEWSTATE debido a que daba errores en algunos Nokia. Lo primero, fue editar el Web.Config:
<pages enableViewState="false" />
Con esto, se logra achicar el Viewstate pero no resuelve el problema por completo, ya que en el xHtml generado aparece lo siguiente:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTU0MzE2NzU0MGRk" />
Incluso con <%@ Page Language="C#" EnableViewState="false" ... %> por cada página tampoco logramos ningún cambio.
Otra opción fue eliminar el control __VIEWSTATE dinámicamente con el siguiente código:
protected override void Render(HtmlTextWriter writer)
{
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
base.Render(htmlWriter);
string html = stringWriter.ToString();
int endPoint;
int startPoint = html.IndexOf("<input type=\"hidden\" name=\"__VIEWSTATE\"");
if (startPoint >= 0)
{
endPoint = html.IndexOf("/>", startPoint) + 2;
html = html.Remove(startPoint, endPoint - startPoint);
}
writer.Write(html);
}
Sí, no es lo más elegante pero cumplió su cometido y quitó completamente el Viewstate. Eso si.. dejo de funcionar todo el sitio :-(
ASP.NET "necesita" que exista un control hidden llamado VIEWSTATE por lo que la solución pasa por agregar el siguiente código en el Form
protected override object LoadPageStateFromPersistenceMedium()
{
return Session["ViewState"];
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
Session["ViewState"] = viewState;
RegisterHiddenField("__VIEWSTATE", "");
}
Listo!! ahora el sitio funciona correctamente, el Viewstate quedó de la siguiente manera:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />
Y puedo continuar utilizando las propiedades de mis controles TextBox1.Text, Label1.SkinID, etc etc ya que estos objetos los crea ASP.NET sin necesidad del Viewstate sino simplemente con el stream que viaja en cada HTTP POST.
Lo ideal sería que tanto el override de Render, LoadPageStateFromPersistenceMedium y SavePageStateToPersistenceMedium estén dentro de una clase que herede de System.Web.UI.Page y los demás Forms hereden de esa nueva clase creada.
Saludos.
Comment Notification
If you would like to receive an email when updates are made to this post, please register here
Subscribe to this post's comments using