2010-03-12 16 views
15

Ho un sito che presenta alcune pagine che non richiedono alcuna funzionalità di post-back. Visualizzano semplicemente codice HTML statico e non hanno nemmeno alcun codice associato. Tuttavia, dal momento che la pagina master ha un tag <form runat="server"> che avvolge tutti ContentPlaceHolder s, il codice HTML risultante contiene sempre la ViewState campo, vale a dire:Rimuovere completamente ViewState per pagine specifiche

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

EDIT: Ho provato entrambe le varianti di impostazione EnableViewState sul livello di pagina senza fortuna a tutti:

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

mi rendo conto che quando decifrati, questo valore del campo input corrisponde al tag <form> che non posso rimuovere perché è sulle mie mas ter. Tuttavia, vorrei ancora rimuovere il campo ViewState per le pagine che mostrano solo HTML statico. È possibile?

+0

Rinominare il file statico in .html o impostare EnableViewState su false nella direttiva della pagina. –

risposta

23

È possibile sovrascrivere il rendering e estrarlo con un Regex.

Campione come richiesto. (NB: Un sovraccarico di questo sarebbe quasi certamente maggiore di ogni possibile beneficio!)

[modifica: questa funzione è stata utile anche per rimuovere tutte le caselle di input nascoste per l'utilizzo dell'output HTML come parola doc cambiando il MIMEType e file extension)

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

Cura di fornire un campione? – Kerido

+0

L'NB dovrebbe essere scritto in grassetto, 20 punti maiuscolo anziché tra parentesi. Questo è uno dei risultati migliori in Google e le persone ** utilizzeranno questo codice anche se non dovrebbero. Lo garantisco. –

4

Nella direttiva <% @page ... nella parte superiore della pagina, aggiungere EnableViewState = "False". Ciò impedirà il ViewState per quella particolare pagina.

+2

Questo è già il caso. Tuttavia, il campo è ancora lì. Ho aggiornato la domanda – Kerido

+3

Questo non ha funzionato –

3

Il metodo suggerito da Martin deve essere utilizzato con molta attenzione; perché potrebbe causare comportamenti imprevisti nelle pagine come indicato da Martin tra parentesi. L'ho provato davvero. Ma c'è un'altra opzione per rimuovere in modo sicuro il contenuto di Viewstate dalla pagina.

Questa opzione consente di utilizzare viewstate senza impostare false, ma consente anche di rimuoverlo dalle proprie pagine. Si prega di verificare gli articoli qui sotto:

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

2- http://aspalliance.com/72

c'è un file zippato soluzione sotto l'articolo di Peter [1] è possibile scaricare. Raccomando di leggere il secondo articolo a cui fa riferimento anche Peter. Questa è una soluzione perfetta per rimuovere il contenuto di Viewstate dalla tua pagina durante l'utilizzo delle sue funzionalità.

13

Add seguenti metodi per la pagina:

 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(); 
    } 

Risultato:

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

Fantastico, grazie! – Craig

+1

@Craig: siete i benvenuti, ma mi sono spostato da asp pages e mvc, preferisco Angularjs e webservices invece che molti workaround in asp.net non sono necessari. – Arjang

0

ViewState viene aggiunto solo se un asp: La forma è presente nella pagina. Rimuovi il modulo e il campo nascosto non verrà reso.

Attenzione: facendo questo, si rinuncia anche ad avere gestori di eventi lato server o qualsiasi tipo di eventi PostBack.

0

o semplicemente usare una semplice linea di jQuery per rimuovere i campi, se si sta utilizzando le richieste di postback in stile AJAX ...

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

Ciò elimina la DIV stringe i campi __VIEWSTATE nascosti.

+0

semplici ed efficienti:.. $ (document) .ready (function() { setTimeout (function() {$ ("#__ ViewState") rimuovere(); $ ("#__ VIEWSTATEGENERATOR") rimuovere(); }, 300); }); –

0

in .net4 è sufficiente rimuovere il tag runat="server" dal tag form. Ma non è possibile utilizzare i controlli del server all'interno del tag form dopo averlo rimosso.

+0

Questo ha fatto il lavoro! –

Problemi correlati