2010-03-04 2 views
6

Quali sono le migliori e più recenti modi per spostare ViewState a fondo alla paginaASP.NET: Moving ViewState in fondo alla pagina

si può fare in un IHttpHandler che può essere specificato nella web.config per intercettare le richieste in "* .aspx"?

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

Altre opzioni è che questo potrebbe essere fatto in un IHttpModule, ma che è non come performante, come sarà intercettare tutte le richieste.

Inoltre si potrebbe fare in una classe derivante dalla pagina o MasterPage di prima classe, ma questo è non come modulare.

Ci sono delle penalità prestazioni a questo?

+5

Posso chiedere perché si desidera spostarlo in fondo alla pagina? Dubito che a qualcuno importi quanto sia sexy il tuo aspetto HTML visualizzato :) – Polaris878

+0

@ Polaris878, che sono d'accordo con (+1), ma, per le pagine con stato di visualizzazione enorme, li renderebbe più facili da guardare quando visualizzi il sorgente/debug :) – Rob

+6

cura dei crawler di ricerca. – IrishChieftain

risposta

1

Dopo aver effettuato alcune ricerche ho messo insieme this blog-post.

ho risolto il problema creando un HttpModule e applicando un filtro Response, che modifica l'uscita della pagina e sposta il ViewState al fondo del modulo.

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

che è piuttosto ottimistico ... che dire degli URL senza estensione o se stai usando qualcos'altro oltre ad aspx? No, dovresti invece verificare se il tuo gestore corrente è System.Web.UI.Page o no. bool isAspNetPageRequest = application.Context.Handler è System.Web.UI.Page; –

+0

Input molto molto buono @BurningIce –

2

È possibile controllare come e dove i dati ViewState vengono caricati e salvati creando un'implementazione personalizzata della classe PageStatePersister. Quindi creare una classe base per tutte le tue pagine ASPX e sovrascrivere il metodo PageStatePersister per restituire l'implementazione personalizzata. Questo può quindi toccare in qualsiasi evento di pagina che si desidera memorizzare il viewstate in base alle proprie esigenze.

Mi chiedo se vale la pena o meno. Stai memorizzando una tonnellata di dati nel numero ViewState inutilmente? Forse puoi ottenere più benefici semplicemente usando lo ViewState in meno o disattivandolo per alcuni controlli invece di spostarlo in una posizione diversa all'interno della pagina HTML.

0

L'estensione della classe Page offre il massimo controllo sul rendering della pagina. Se si desidera spostare ViewState in fondo a una determinata pagina, utilizzare la classe base personalizzata per quella pagina. Se non è necessario, utilizzare la classe Page.

L'unico rischio di prestazioni derivante dalla classe Page è nell'implementazione dei metodi sovrascritti. A meno che tu non stia facendo qualcosa di particolarmente inefficiente, non dovrebbe esserci alcun colpo di performance percepibile.