2010-03-12 7 views
15

Ich habe eine Website mit einigen Seiten, die keine Post-Back-Funktionalität erfordern. Sie zeigen einfach statische HTML und haben nicht einmal zugehörigen Code. Da jedoch die Master-Seite einen <form runat="server"> Tag hat, die all ContentPlaceHolder s Wraps, enthält das resultierende HTML immer das Viewstate Feld, das heißt:ViewState für bestimmte Seiten vollständig entfernen

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

EDIT: habe ich versucht, beiden Varianten von EnableViewState auf Seite Pegeleinstellung überhaupt ohne Glück:

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

mir ist klar, dass, wenn entschlüsselt, wird dieser Wert des input Feld zum <form> Tag entspricht, die ich nicht entfernen kann, weil es auf meinem mas ter Seite. Trotzdem möchte ich das ViewState-Feld für Seiten entfernen, die nur statisches HTML anzeigen. Ist es möglich?

+0

Benennen Sie Ihre statische Datei in .html um oder setzen Sie EnableViewState in der Seitenanweisung auf false. –

Antwort

23

Sie können Render überschreiben und es mit einem Regex entfernen.

Beispiel wie angefordert. (Hinweis: Overhead dies wäre fast sicher größer als jeder mögliche Nutzen obwohl!)

[edit: diese Funktion war auch nützlich, um alle versteckten Eingabefelder für die Verwendung der HTML-Ausgabe als Word-Dokument durch Ändern des MIMEType zu entfernen und Dateiendung]

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

Pflege, um eine Probe zu stellen? – Kerido

+0

Das NB sollte fett geschrieben werden, 20pt alle Großbuchstaben statt zwischen Klammern. Dies ist eines der Top-Ergebnisse in Google und Menschen ** werden diesen Code verwenden, obwohl sie nicht sollten. Ich garantiere es. –

4

Fügen Sie in der <% @page ... Direktive oben auf der Seite EnableViewState = "False" hinzu. Das verhindert den ViewState für diese bestimmte Seite.

+2

Dies ist bereits der Fall. Das Feld ist jedoch immer noch da. Ich habe die Frage aktualisiert – Kerido

+3

Dies hat nicht funktioniert –

3

Das Verfahren von Martin vorgeschlagen muss sehr sorgfältig verwendet werden; weil es auf Ihren Seiten zu unerwartetem Verhalten führen kann, wenn Martin in Klammern zeigt. Ich habe es tatsächlich erlebt. Aber es gibt eine andere Option, um den Viewstate-Inhalt sicher von der Seite zu entfernen.

Diese Option gibt Ihnen die Möglichkeit, viewstate zu verwenden, ohne false zu setzen, und Sie können es auch von Ihren Seiten entfernen. Bitte überprüfen Sie die Artikel unten:

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

2- http://aspalliance.com/72

Es gibt eine Lösung Datei unter dem Artikel Peter Reißverschluss [1] Sie herunterladen können. Ich empfehle Ihnen, den zweiten Artikel zu lesen, auf den auch Peter Bezug nimmt. Dies ist eine perfekte Lösung, um den Anzeigestatus-Inhalt von Ihrer Seite zu entfernen, während Sie dessen Fähigkeiten nutzen.

13

Fügen Sie die folgenden Methoden zur Seite:

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

Ergebnis:

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

Super, danke! – Craig

+1

@Craig: Sie sind willkommen, aber ich habe weg von ASP-Seiten und MVC, ich bevorzuge Angularjs und Webservices stattdessen, so dass viele Workarounds in ASP.net nicht benötigt werden. – Arjang

0

Viewstate wird nur hinzugefügt, wenn ein asp: Form in der Seite vorhanden ist. Entfernen Sie das Formular, und das ausgeblendete Feld wird nicht gerendert.

Vorsicht: Dadurch verzichten Sie auch auf serverseitige Ereignishandler oder PostBack-Ereignisse jeder Art.

0

Oder benutzen Sie einfach eine einfache jQuery Linie um die Felder zu entfernen, wenn Sie mit AJAX-Stil Postbacks Anfragen ...

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

Dies entfernt die DIV die versteckten __VIEWSTATE Felder Umhüllen.

+0

Einfach und effizient:.. $ (document) .ready (function() { setTimeout (function() { $ ("#__ VIEWSTATE") entfernen(); $ ("#__ VIEWSTATEGENERATOR") entfernen(); }, 300); }); –

0

in .net4 können Sie einfach die runat="server" aus dem form Tag entfernen. Sie können jedoch keine Serversteuerelemente innerhalb des Tags form verwenden, nachdem Sie es entfernt haben.

+0

Das hat den Job gemacht! –

Verwandte Themen