2010-03-04 10 views
6

bewegt Was die neuesten und besten Wege sind Viewstate unten auf der Seite zu bewegenASP.NET: Viewstate unten auf der Seite

dies in einem IHttpHandler getan werden kann, die in den angegeben werden können web.config um Anfragen an "* .aspx" abzufangen?

<httpHandlers> 
    <add verb="*" path="*.aspx" type="MyApp.OptimizedPageHandler" /> 
<httpHandlers> 

Andere Optionen sind, dass dies in einem IHttpModule getan werden könnte, aber das ist nicht so performant, da es alle Anforderungen abfängt.

Auch könnte es in einer Klasse im Zusammenhang mit der Seite oder Master -Klasse getan werden, aber dies ist nicht als modulares.

Gibt es irgendwelche Leistungsstrafen zu diesem?

+5

Kann ich fragen, warum Sie es am Ende der Seite verschieben möchten? Ich bezweifle, dass jemand interessiert, wie sexy Ihre gerenderten HTML aussieht :) – Polaris878

+0

@ Polaris878, die ich stimme mit (+1), aber für Seiten mit riesigen Ansichtsstatus, würde es sie leichter auf das Auge beim Anzeigen von Quelle/Debugging machen :) – Rob

+6

Suche Crawler Pflege. – IrishChieftain

Antwort

1

Nach einigen Untersuchungen habe ich this blog-post zusammengestellt.

I löste das Problem durch eine Httpmodule und Anlegen einer Response Filter, zu schaffen, die die Ausgabe der Seite modifiziert und bewegt den Viewstate auf dem Boden der Form.

public class ViewStateSeoHttpModule : IHttpModule { 
    public void Init(HttpApplication context) { 
     context.BeginRequest += new EventHandler(BeginRequest); 
    } 

    private void BeginRequest(object sender, EventArgs e) { 
     HttpApplication application = sender as HttpApplication; 

     bool isAspNetPageRequest = GetIsAspNetPageRequest(application); 
     if(isAspNetPageRequest) { 
      application.Context.Response.Filter = 
       new ViewStateSeoFilter(application.Context.Response.Filter); 
     } 
    } 

    private bool GetIsAspNetPageRequest(HttpApplication application) { 
     bool isAspNetPageRequest = application.Context.Handler is System.Web.UI.Page; 
     return isAspNetPageRequest; 
    } 
    // [...] 
+2

das ist ziemlich optimistisch ... was ist mit extensionless URLs oder wenn Sie etwas anderes als aspx verwenden? Nein, Sie sollten stattdessen prüfen, ob Ihr aktueller Handler eine System.Web.UI.Page ist oder nicht. bool isAspNetPageRequest = application.Context.Handler ist System.Web.UI.Page; –

+0

Sehr sehr gute Eingabe @BurningIce –

2

Sie können steuern, wie und wo ViewState-Daten geladen und gespeichert werden, indem Sie eine benutzerdefinierte Implementierung der Klasse PageStatePersister erstellen. Erstellen Sie anschließend eine Basisklasse für alle Ihre ASPX-Seiten und überschreiben Sie die PageStatePersister-Methode, um Ihre benutzerdefinierte Implementierung zurückzugeben. Dadurch können Sie auf die Seitenereignisse zugreifen, in denen Sie den Ansichtszustand gemäß Ihren Anforderungen speichern möchten.

Ich Frage, ob es sich lohnt oder nicht. Speichern Sie unnötig viele Daten in der ViewState? Vielleicht können Sie mehr Nutzen daraus ziehen, indem Sie einfach ViewState weniger verwenden oder es für einige Steuerelemente deaktivieren, anstatt es einfach an einen anderen Ort innerhalb der HTML-Seite zu verschieben.

0

Durch die Erweiterung der Page-Klasse haben Sie die größte Kontrolle über das Seitenrendering. Wenn Sie ViewState an den Anfang einer bestimmten Seite verschieben möchten, verwenden Sie Ihre benutzerdefinierte Basisklasse für diese Seite. Wenn Sie dies nicht benötigen, verwenden Sie die Klasse Page.

Das einzige Leistungsrisiko beim Ableiten von der Page-Klasse besteht in der Implementierung von überschriebenen Methoden. Sofern Sie nicht besonders ineffizient sind, sollte es keinen wahrnehmbaren Leistungseinbruch geben.

Verwandte Themen