Controllo dello stato di visualizzazione

Aggiornamento: novembre 2007

Le pagine Web Microsoft ASP.NET sono in grado di mantenere integro il relativo stato nei round trip. 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 ASP.NET ordinarie viene inviato dal server come campo nascosto in un form nell'ambito della 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 invece viene salvato nel 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 da ASP.NET come parte di ogni risposta al client e viene restituito al server dal client come parte del successivo postback.

Gestione della cronologia dello stato di visualizzazione

Poiché è necessario che lo stato di visualizzazione di una determinata pagina sia mantenuto nel server, se l'utente fa clic sul pulsante Indietro del browser è possibile che lo stato corrente sul server non sia sincronizzato con la pagina corrente del browser. Se ad esempio l'utente visualizza la Pagina 1, quindi fa clic su un pulsante per visualizzare la Pagina 2 e infine fa clic sul pulsante Indietroper 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.

È possibile configurare la dimensione della cronologia per ottimizzarla in base all'applicazione. La dimensione predefinita è 6 e può essere modificata aggiungendo un attributo numerico a un 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 Web per dispositivi mobili. Quando l'utente invia 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. Se tuttavia un'applicazione è in grado di ripristinare manualmente 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 è rappresentato dalle minori dimensioni della risposta. Lo svantaggio è determinato dal fatto che l'utilizzo inefficiente dello stato sessione può comportare una riduzione delle prestazioni. Se si utilizzano controlli con grandi quantità di dati, è possibile migliorare l'efficienza utilizzando tecniche quali il paging personalizzato o la disattivazione dello stato di visualizzazione Si supponga ad esempio di disporre di un sito in cui è possibile visualizzare articoli sui casi personali. Invece di salvare il contenuto degli articoli per ogni sessione utente, in questo 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, impostare l'attributo EnableViewState della direttiva @ Page su false.

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 delle informazioni sullo stato sessione nelle informazioni del cookie. Molti dispositivi mobili tuttavia 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 lo stato del client a lungo termine, è possibile che in un'applicazione vengano utilizzate informazioni specifiche del client, ad esempio un numero cliente immesso dall'utente. 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 fornito un esempio. 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  language="c#">
protected void Page_Load(Object sender, EventArgs e)
{
    String customerID = Request.QueryString["cid"];

    if (customerID != null)
    {
        // A customer ID was found. Simulate 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, {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. Normally, you would 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 >
  <mobile:Label  StyleReference="title">
    Welcome to the site. Please register to continue.
  </mobile:Label>
  <mobile:TextBox  id="CustomerName" />
  <mobile:Command  OnClick="LoginForm_OnSubmit" 
    Text="Register" />
</mobile:Form>

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

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

Ottimizzazione dello stato di visualizzazione per applicazioni mobili

È importante tenere presente le seguenti considerazioni relativamente alle pagine Web per dispositivi mobili:

  • Il salvataggio dello stato di visualizzazione nello stato sessione è altamente ottimizzato. Se non esiste alcuno stato di visualizzazione da salvare, non verrà salvata alcuna informazione nella sessione e non verrà inviato alcun identificatore 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 Web per dispositivi mobili siano archiviati altri tipi di informazioni dello stato relative alla pagina. In queste informazioni può essere incluso il form attivo o le informazioni di paginazione 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 privato.

    Nota:

    Se nello stato sessione vengono incluse informazioni riservate, per motivi di sicurezza è consigliabile utilizzare una connessione con autenticazione SSL/TLS e HTTPS.

Vedere anche

Concetti

Cenni preliminari sulla gestione dello stato ASP.NET

Controllo dello stato sessione

Riferimenti

LoadPrivateViewState

SavePrivateViewState

Altre risorse

Supporto dello stato di visualizzazione

Creazione di pagine Web ASP.NET per dispositivi mobili

Guida per gli sviluppatori di applicazioni

Sviluppo di pagine Web ASP.NET per dispositivi mobili