asp.net - Eliminar completamente ViewState para páginas específicas
optimization (8)
Tengo un sitio que presenta algunas páginas que no requieren ninguna funcionalidad posterior a la devolución. Simplemente muestran HTML estático y ni siquiera tienen ningún código asociado. Sin embargo, dado que la Página maestra tiene una etiqueta <form runat="server">
que envuelve a todos los ContentPlaceHolder
, el HTML resultante siempre contiene el campo ViewState , es decir:
<input
type="hidden"
id="__VIEWSTATE"
value="/wEPDwUKMjEwNDQyMTMxM2Rk0XhpfvawD3g+fsmZqmeRoPnb9kI="
/>
EDITAR: EnableViewState
dos variantes de configuración de EnableViewState
en el nivel de página sin suerte:
<%@ Page Language="C#" EnableViewState="false" %>
<%@ Page Language="C#" EnableViewState="true" %>
Me doy cuenta de que, cuando se descifra, este valor del campo de input
corresponde a la etiqueta <form>
que no puedo eliminar porque está en mi página maestra. Sin embargo, me gustaría eliminar el campo ViewState para las páginas que solo muestran HTML estático. ¿Es posible?
En la directiva <% @page ... en la parte superior de la página, agregue EnableViewState = "False". Eso evitará ViewState para esa página en particular.
El método sugerido por Martin debe usarse con mucho cuidado; porque puede causar comportamientos inesperados en sus páginas, como señaló Martin entre paréntesis. En realidad lo he experimentado. Pero hay otra opción para eliminar el contenido viewstate de la página de forma segura.
Esta opción le da la posibilidad de usar viewstate sin establecer false, también le permite eliminarlo de sus páginas. Por favor revisa los artículos a continuación:
1- http://www.eggheadcafe.com/articles/20040613.asp
Hay un archivo de solución comprimido bajo el artículo de Peter [1] que puede descargar. Le recomiendo que lea el segundo artículo al que también hace referencia Peter. Esta es una solución perfecta para eliminar el contenido viewstate de su página mientras utiliza sus capacidades.
Agregue los siguientes métodos a la página:
protected override void SavePageStateToPersistenceMedium(object state)
{
//base.SavePageStateToPersistenceMedium(state);
}
protected override object LoadPageStateFromPersistenceMedium()
{
return null; //return base.LoadPageStateFromPersistenceMedium();
}
protected override object SaveViewState()
{
return null;// base.SaveViewState();
}
Resultado:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />
ViewState se agrega solo si hay un formulario asp: presente en la página. Elimine el formulario y el campo oculto no se representará.
Ten cuidado: al hacer esto, también estás renunciando a tener controladores de eventos del lado del servidor o cualquier tipo de eventos PostBack.
Podría anular Renderizar y eliminarlo con Regex.
Muestra según lo solicitado. (NB: ¡La sobrecarga de hacer esto sería sin duda más grande que cualquier beneficio posible!)
[Editar: esta función también fue útil para eliminar todos los cuadros de entrada ocultos para usar el resultado HTML como un documento de Word al cambiar el tipo MIMET y la extensión de archivo]
protected override void Render(HtmlTextWriter output)
{
StringWriter stringWriter = new StringWriter();
HtmlTextWriter textWriter = new HtmlTextWriter(stringWriter);
base.Render(textWriter);
textWriter.Close();
string strOutput = stringWriter.GetStringBuilder().ToString();
strOutput = Regex.Replace(strOutput, "<input[^>]*id=/"__VIEWSTATE/"[^>]*>", "", RegexOptions.Singleline);
output.Write(strOutput);
}
O simplemente use una línea jQuery simple para eliminar los campos, si está usando solicitudes de devolución de datos de estilo AJAX ...
$(".aspNetHidden").remove();
Esto elimina el DIV que encierra los campos ocultos __VIEWSTATE.
en .net4 puedes eliminar runat="server"
de la etiqueta del form
. Pero no puede usar los controles del servidor dentro de la etiqueta del form
una vez que la elimine.
Siempre habrá un ViewState. Ver esta pregunta relacionada: