Controllo dello stato di visualizzazione

Le pagine Web Form Microsoft ASP.NET sono in grado di mantenere integro il relativo stato nei percorsi di andata e ritorno a più client. Quando viene impostata una proprietà per un controllo, il valore della proprietà viene salvato da ASP.NET come parte dello stato del controllo. In questo modo per l'applicazione la durata della pagina dipende dalle richieste di più client. Questo stato a livello di pagina è noto come stato di visualizzazione della pagina.

Lo stato di visualizzazione delle pagine Web Form ordinarie viene inviato dal server come variabile nascosta in un form, come parte di ogni risposta al client e viene restituito al server dal client come parte di un postback. Tuttavia, per ridurre la richiesta di larghezza di banda durante l'utilizzo di controlli mobili, non viene inviato al client lo stato di visualizzazione di una pagina. Lo stato di visualizzazione viene, invece, salvato sul server come parte di una sessione utente. Ovunque sia presente uno stato di visualizzazione, un campo nascosto che identifica lo stato di visualizzazione di questa pagina viene inviato dal server come parte di ogni risposta al client e viene restituito al server dal client come parte della successiva richiesta.

Gestione della cronologia dello stato di visualizzazione

Poiché è necessario che lo stato di visualizzazione di una determinata pagina sia mantenuto nel server, è possibile che lo stato corrente non sia sincronizzato con la pagina corrente del browser. Questa situazione accade quando l'utente fa clic sul pulsante Indietro del browser per tornare alle pagine precedentemente visualizzate.

Se, ad esempio, l'utente visualizza la Pagina 1, quindi fa clic su un pulsante per visualizzare la Pagina 2, infine fa clic sul pulsante Indietro per tornare alla Pagina 1, può accadere che la pagina corrente del browser sia la Pagina 1 ma lo stato corrente nel server sia quello della Pagina 2.

Per risolvere il problema, viene mantenuta nella sessione utente una cronologia delle informazioni dello stato di visualizzazione. Ogni identificatore inviato al client corrisponde a una posizione in questa cronologia. Nell'esempio precedente se l'utente visualizza nuovamente la Pagina 1, per sincronizzare la cronologia verrà utilizzato l'identificatore salvato con la Pagina 1.

La dimensione della cronologia può essere configurata dallo sviluppatore ed è necessario che sia ottimizzata in base all'applicazione. La dimensione predefinita è 6 e può essere modificata aggiungendo un attributo numerico al tag nel file Web.config, come mostrato nell'esempio riportato di seguito.

<configuration>
   <system.web>
      <mobileControls sessionStateHistorySize="10" />
   </system.web>
</configuration>

Gestione delle sessioni scadute

Poiché lo stato di visualizzazione viene salvato nella sessione utente, è possibile che scada se non viene eseguito il postback di una pagina entro i limiti di tempo stabiliti per la scadenza della sessione. La scadenza è univoca per le pagine Mobile Web Forms. Quando l'utente esegue il postback di una pagina di cui non è disponibile alcuno stato di visualizzazione, viene chiamato il metodo OnViewStateExpire della pagina. L'implementazione predefinita di questo metodo genera un'eccezione che indica che lo stato di visualizzazione è scaduto. Tuttavia, se un'applicazione è in grado di ripristinare lo stato di visualizzazione scaduto, sarà anche in grado di eseguire l'override di questo metodo a livello di pagina evitando di chiamare l'implementazione di base.

Attivazione e disattivazione dello stato di visualizzazione

Il vantaggio dell'utilizzo della sessione per la gestione dello stato di visualizzazione da parte di ASP.NET è rappresentato dalle minori dimensioni della risposta. Lo svantaggio è determinato dal fatto che l'utilizzo inefficiente dello stato sessione può comportare una riduzione delle prestazioni. Quando gli sviluppatori utilizzano controlli con grandi quantità di dati, per migliorare l'efficienza possono utilizzare tecniche quali paging personalizzato o disattivazione dello stato di visualizzazione. Prendere come esempio un sito in cui è possibile visualizzare articoli sui casi personali. Invece di salvare il contenuto degli articoli per ogni singolo utente nella sessione, in questo tipo di sito è possibile gestire un accesso ai dati più intelligente in modo che soltanto una copia di ogni articolo sia memorizzata nella cache del server e l'utilizzo dello stato sessione sia ridotto al minimo.

Per disattivare lo stato di visualizzazione per un controllo e i relativi elementi figlio, impostare la proprietà EnableViewState del controllo su false. Per disattivare lo stato di visualizzazione per un'intera pagina, aggiungere un attributo EnableViewState="false" alla direttiva @ Page.

Anche quando lo stato di visualizzazione è disattivato, informazioni essenziali sullo stato vengono salvate da alcuni controlli mobili nei percorsi di andata e ritorno ai client. Un esempio di tali informazioni è rappresentato dal form della pagina correntemente attivo. Quando si disattiva lo stato di visualizzazione, queste informazioni essenziali vengono salvate nella pagina come una variabile del form nascosta inviata al client in un percorso di andata e ritorno.

Per impostazione predefinita, è necessario per le funzionalità di gestione della sessione di ASP.NET che dal server venga scritto un cookie di sessione nel client. Il cookie verrà successivamente inviato dal client a ogni richiesta durante la sessione mentre il server esegue la ricerca dello stato sessione nelle informazioni ricevute. Tuttavia, diversi dispositivi mobili non supportano i cookie. Affinché la gestione della sessione, inclusa la visualizzazione dello stato, funzioni in maniera corretta su questi dispositivi, è necessario configurare l'applicazione in modo che venga utilizzata una gestione della sessione senza cookie. Se questa funzionalità risulta attivata, verrà automaticamente inserita la chiave di sessione negli URL dell'applicazione.

Alcuni dispositivi non supportano i cookie. Per mantenere uno stato del client a lungo termine, è possibile che un'applicazione utilizzi un numero cliente pre-immesso. Poiché non è possibile utilizzare un client che supporta i cookie, è necessario che l'applicazione reindirizzi l'utente verso una pagina alternativa che può essere utilizzata come segnalibro. Di seguito viene riportato un esempio di tale sito. Gli utenti che esplorano questo URL visualizzano un form in cui sono immessi gli ID cliente. Al termine dell'immissione degli ID cliente, verrà visualizzato un URL alternativo che è possibile utilizzare come segnalibro.

<%@ Page Inherits="System.Web.UI.MobileControls.MobilePage" Language="C#"
   EnableViewState="false" %>

<script runat="server" language="c#">

protected void Page_Load(Object sender, EventArgs e)
{
   String customerID = Request.QueryString["cid"];

   if (customerID != null)
   {
      // A customer ID was found. Here, you would normally look
      // up the customer's profile in a database. 
      // This code simulates such a lookup by converting the client ID
      // back to a user.

      int underscore = customerID.IndexOf('_');

      if (underscore != -1)
      {
         // If visiting the first time, prompt the user to bookmark.

         if (Session["FirstTime"] != null)
         {
            Session["FirstTime"] = null;
            WelcomeLabel.Text = String.Format("Welcome to the site, {0}", 
               customerID.Substring(0, underscore));
            ActiveForm = WelcomeForm;
         }
         else
         {
            ReturnLabel.Text = String.Format("Welcome back, {0}", 
               customerID.Substring(0, underscore));
            ActiveForm = ReturnForm;
         }
      }
   }
}

protected void LoginForm_OnSubmit(Object sender, EventArgs e)
{
   // Generate a customer ID. Here, you would normally create
   // a new customer profile.

   String customerID = CustomerName.Text + "_" + 
      System.Guid.NewGuid().ToString();
   String path = AbsoluteFilePath + "?cid=" + 
      Server.UrlEncode(customerID);
   Session["FirstTime"] = true;
   RedirectToMobilePage(path);
}

</script>

<mobile:Form runat="server">
   <mobile:Label runat="server" StyleReference="title">
      Welcome to the site. Please register to continue.
   </mobile:Label>
   <mobile:TextBox runat="server" id="CustomerName" />
   <mobile:Command runat="server" OnClick="LoginForm_OnSubmit" 
      Text="Register" />
</mobile:Form>

<mobile:Form id="WelcomeForm" runat="server">
   <mobile:Label runat="server" id="WelcomeLabel" />
   Please bookmark this page for future access.
</mobile:Form>

<mobile:Form id="ReturnForm" runat="server">
   <mobile:Label runat="server" id="ReturnLabel" />
</mobile:Form>

Ottimizzazione dello stato di visualizzazione per applicazioni mobili

È importante tenere presente le seguenti considerazioni relativamente alle pagine Mobile Web Forms:

  • Il salvataggio dello stato di visualizzazione nella sessione è altamente ottimizzato. Se non esiste alcuno stato di visualizzazione da salvare, non verrà salvata alcuna informazione nella sessione e nessun identificatore verrà inviato al client. Tuttavia, gli sviluppatori di applicazioni che desiderano evitare l'utilizzo della gestione della sessione o che desiderano che le pagine presentino una maggiore velocità effettiva possono considerare di ridurre o eliminare l'utilizzo dello stato di visualizzazione. In molti casi, ad esempio durante l'esecuzione del rendering di una pagina di un testo formattato, lo stato di visualizzazione non è necessario ed è consigliabile disattivarlo.
  • Oltre allo stato di visualizzazione dell'applicazione, è necessario che in una pagina Mobile Web Forms siano memorizzati altri tipi di informazioni dello stato relative alla pagina. In queste informazioni sono incluse il form attivo o le informazioni di impaginazione relative al form. Tali informazioni non vengono mantenute sul server ma vengono sempre inviate al client e solitamente vengono generate in maniera ottimizzata. Se, ad esempio, il primo form è attivo o la prima pagina di un form viene visualizzata, le informazioni in questione non verranno salvate poiché questi sono stati predefiniti. Queste informazioni relative allo stato sono definite stato di visualizzazione privata. Tutti i controlli sono in grado di eseguire l'override dei metodi LoadPrivateViewState e SavePrivateViewState per la lettura e la scrittura dello stato di visualizzazione privata.

Per informazioni sulle variabili nascoste e su come è possibile utilizzarle per salvare le informazioni relative allo stato di visualizzazione, vedere Gestione dello stato di ASP.NET.

Nota   Se nello stato sessione vengono incluse informazioni riservate relative all'uso di maiuscole e minuscole, per motivi di protezione è consigliabile utilizzare una connessione protetta, ad esempio utilizzando un'autenticazione HTTPS e SSL/TLS.

Vedere anche

Controllo dello stato della sessione | Supporto dello stato di visualizzazione | Creazione di applicazioni Web mobili ASP.NET | Guida per gli sviluppatori di applicazioni | Sviluppo di applicazioni Web mobili | Gestione dello stato di ASP.NET | LoadPrivateViewState | SavePrivateViewState