2010-03-12 15 views
15

Tengo un sitio que presenta algunas páginas que no requieren ninguna funcionalidad posterior. Simplemente muestran HTML estático y ni siquiera tienen ningún código asociado. Sin embargo, desde la página maestra tiene una etiqueta <form runat="server"> que envuelve todos los ContentPlaceHolder s, el HTML resultante contiene siempre el campo ViewState, es decir:Elimine completamente ViewState para páginas específicas

<input 
    type="hidden" 
    id="__VIEWSTATE" 
    value="/wEPDwUKMjEwNDQyMTMxM2Rk0XhpfvawD3g+fsmZqmeRoPnb9kI=" 
/> 

EDIT: Me trataron las dos variantes de configuración de EnableViewState en el nivel de página sin suerte en absoluto:

<%@ Page Language="C#" EnableViewState="false" %> 
<%@ Page Language="C#" EnableViewState="true" %> 

que se dan cuenta, que cuando descifrado, este valor del campo input corresponde con la etiqueta <form> que no puedo quitar porque está en mis mas ter página. Sin embargo, me gustaría eliminar el campo ViewState para las páginas que solo muestran HTML estático. ¿Es posible?

+0

Cambie el nombre de su archivo estático a .html o establezca EnableViewState en false en la directiva de la página. –

Respuesta

23

Puede reemplazar el procesamiento y eliminarlo con un Regex.

Ejemplo 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 la salida HTML como una palabra doc cambiando el tipo MIMET y 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); 
} 
+0

¿Cuida proporcionar una muestra? – Kerido

+0

El NB debe escribirse en negrita, 20 pt todas mayúsculas en lugar de entre paréntesis. Este es uno de los mejores resultados en Google y las personas ** usarán ** este código aunque no lo hagan. Lo garantizo. –

4

En la directiva <% @page ... en la parte superior de la página, agregue EnableViewState = "False". Eso evitará ViewState para esa página en particular.

+2

Esto ya es el caso. Sin embargo, el campo todavía está allí. Actualicé la pregunta – Kerido

+3

Esto no funcionó –

3

El método sugerido por Martín se debe utilizar 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, sino que también le permite eliminarlo de sus páginas. Por favor, compruebe los siguientes artículos:

1- http://www.eggheadcafe.com/articles/20040613.asp

2- http://aspalliance.com/72

No es un archivo de solución con cremallera en el artículo de Peter [1] se 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. se añade

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" /> 
13

Agregar 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 formulario está presente en la página. Elimine el formulario y el campo oculto no se representará.

Cuidado: al hacer esto, también está renunciando a tener controladores de eventos del lado del servidor, o cualquier tipo de eventos PostBack.

+1

¡Increíble, gracias! – Craig

+1

@ Craig: eres bienvenido, pero me he alejado de las páginas asp y mvc, prefiero Angularjs y servicios web, por lo que muchas soluciones en asp.net no son necesarias. – Arjang

0

o simplemente utilizar una simple línea de jQuery para eliminar los campos, si utiliza las solicitudes de devolución de estilo AJAX ...

$(".aspNetHidden").remove(); 

Esto elimina el DIV que encierra los campos __VIEWSTATE ocultos.

+0

simples y eficientes:.. $ (document) ready (function() { setTimeout (function() {$ ("#__ VIEWSTATE") eliminar(); $ ("#__ VIEWSTATEGENERATOR") remove(); }, 300); }); –

0

en .net4 simplemente puede eliminar el runat="server" de la etiqueta form. Pero no puede usar los controles del servidor dentro de la etiqueta form una vez que la elimine.

+0

¡Esto hizo el trabajo! –