Share via


Personalizzazione del comportamento di Site-Wide per i siti Pagine Web ASP.NET (Razor)

di Tom FitzMacken

Questo articolo illustra come creare impostazioni sul lato sito per le pagine in un sito Web Pagine Web ASP.NET (Razor).

Contenuto dell'esercitazione:

  • Come eseguire il codice che consente di impostare valori (valori globali o impostazioni helper) per tutte le pagine di un sito.
  • Come eseguire il codice che consente di impostare valori per tutte le pagine in una cartella.
  • Come eseguire il codice prima e dopo il caricamento di una pagina.
  • Come inviare errori a una pagina di errore centrale.
  • Come aggiungere l'autenticazione a tutte le pagine di una cartella.

Versioni software usate nell'esercitazione

  • Pagine Web ASP.NET (Razor) 2
  • WebMatrix 3
  • libreria ASP.NET Web Helpers (pacchetto NuGet)

Questa esercitazione funziona anche con Pagine Web ASP.NET 3 e Visual Studio 2013 (o Visual Studio Express 2013 per Web), ad eccezione di non è possibile usare la libreria guida Web ASP.NET.

Aggiunta del codice di avvio del sito Web per Pagine Web ASP.NET

Per gran parte del codice scritto in Pagine Web ASP.NET, una singola pagina può contenere tutto il codice necessario per tale pagina. Ad esempio, se una pagina invia un messaggio di posta elettronica, è possibile inserire tutto il codice per tale operazione in una singola pagina. Questo può includere il codice per inizializzare le impostazioni per l'invio di posta elettronica (ovvero per il server SMTP) e per l'invio del messaggio di posta elettronica.

Tuttavia, in alcune situazioni, potrebbe essere necessario eseguire un codice prima dell'esecuzione di qualsiasi pagina nel sito. Ciò è utile per impostare i valori che possono essere usati ovunque nel sito (denominati valori globali). Ad esempio, alcuni helper richiedono di fornire valori come impostazioni di posta elettronica o chiavi dell'account. Può essere utile mantenere queste impostazioni nei valori globali.

È possibile eseguire questa operazione creando una pagina denominata _AppStart.cshtml nella radice del sito. Se questa pagina esiste, viene eseguita la prima volta che viene richiesta qualsiasi pagina nel sito. Pertanto, è consigliabile eseguire il codice per impostare i valori globali. Poiché _AppStart.cshtml ha un prefisso di sottolineatura, ASP.NET non invierà la pagina a un browser anche se gli utenti lo richiedono direttamente.

Il diagramma seguente illustra il funzionamento della pagina _AppStart.cshtml . Quando una richiesta viene inserita per una pagina e se si tratta della prima richiesta per qualsiasi pagina nel sito, ASP.NET verifica prima se esiste una pagina _AppStart.cshtml . In tal caso, viene eseguito qualsiasi codice nella pagina _AppStart.cshtml e quindi viene eseguita la pagina richiesta.

[Immagine che mostra come funziona il punto CSHTML dell'app Star.]

Impostazione dei valori globali per il sito Web

  1. Nella cartella radice di un sito WebMatrix creare un file denominato _AppStart.cshtml. Il file deve trovarsi nella radice del sito.

  2. Sostituire il contenuto esistente con quanto segue:

    @{
      AppState["customAppName"] = "Application Name";
    }
    

    Questo codice archivia un valore nel AppState dizionario, che è automaticamente disponibile per tutte le pagine del sito. Si noti che il file _AppStart.cshtml non ha alcun markup in esso. La pagina eseguirà il codice e quindi reindirizzerà alla pagina richiesta originariamente.

    Nota

    Prestare attenzione quando si inserisce il codice nel file _AppStart.cshtml . Se si verificano errori nel codice nel file _AppStart.cshtml , il sito Web non verrà avviato.

  3. Nella cartella radice creare una nuova pagina denominata AppName.cshtml.

  4. Sostituire il markup e il codice predefiniti con quanto segue:

    <!DOCTYPE html>
    <html>
        <head>
            <title>Show Application Name</title>
        </head>
        <body>
            <h1>@AppState["customAppName"]</h1>
        </body>
    </html>
    

    Questo codice estrae il valore dall'oggetto AppState impostato nella pagina _AppStart.cshtml .

  5. Eseguire la pagina AppName.cshtml in un browser. Assicurarsi che la pagina sia selezionata nell'area di lavoro File prima di eseguirla. La pagina visualizza il valore globale.

    [Screenshot che mostra la pagina che visualizza il valore globale.]

Impostazione dei valori per gli helper

Un buon uso per il file _AppStart.cshtml consiste nel impostare i valori per gli helper usati nel sito e che devono essere inizializzati. Gli esempi tipici sono impostazioni di posta elettronica per l'helper e le chiavi private e pubbliche per l'helper WebMailReCaptcha . In casi come questi, è possibile impostare i valori una volta nel _AppStart.cshtml e quindi sono già impostati per tutte le pagine del sito.

Questa procedura illustra come impostare WebMail le impostazioni a livello globale. Per altre informazioni sull'uso dell'helperWebMail, vedere Aggiunta di Email a un sito Pagine Web ASP.NET.

  1. Aggiungere la libreria di helper Web ASP.NET al sito Web, come descritto in Installazione degli helper in un sito Pagine Web ASP.NET, se non è già stato aggiunto.

  2. Se non si dispone già di un file _AppStart.cshtml , nella cartella radice di un sito Web creare un file denominato _AppStart.cshtml.

  3. Aggiungere le impostazioni seguenti WebMail al file _AppStart.cshtml :

    @{
         // Initialize WebMail helper
         WebMail.SmtpServer = "your-SMTP-host";
         WebMail.SmtpPort = 25;
         WebMail.UserName = "your-user-name-here";
         WebMail.Password = "your-account-password";
         WebMail.From = "your-email-address-here";
    }
    

    Modificare le impostazioni correlate all'indirizzo di posta elettronica seguenti nel codice:

    • Impostare your-SMTP-host sul nome del server SMTP a cui si ha accesso.

    • Impostare your-user-name-here sul nome utente per l'account del server SMTP.

    • Impostare your-account-password sulla password per l'account del server SMTP.

    • Impostare your-email-address-here sul proprio indirizzo di posta elettronica. Si tratta dell'indirizzo di posta elettronica da cui viene inviato il messaggio. Alcuni provider di posta elettronica non consentono di specificare un indirizzo diverso From e useranno il nome utente come From indirizzo.

      Per altre informazioni sulle impostazioni SMTP, vedere Configurazione delle impostazioni Email nell'articolo Invio di Email da un sito Pagine Web ASP.NET (Razor) e problemi relativi all'invio di Email nella guida alla risoluzione dei problemi di Pagine Web ASP.NET (Razor).

  4. Salvare il file _AppStart.cshtml e chiuderlo.

  5. Nella cartella radice di un sito Web creare una nuova pagina denominata TestEmail.cshtml.

  6. Sostituire il contenuto esistente con quanto segue:

    @{
        var message = "";
        try{
            if(IsPost){
                WebMail.Send(
                    to: Request.Form["emailAddress"],
                    subject: Request.Form["emailSubject"],
                    body:Request.Form["emailBody"]
               );
               message = "Email sent!";
            }
        }
        catch(Exception ex){
            message = "Email could not be sent!";
        }
    }
    <!DOCTYPE html>
    <html lang="en">
      <head>
         <meta charset="utf-8" />
         <title>Test Email</title>
      </head>
      <body>
        <h1>Test Email</h1>
        <form method="post">
          <p>
            <label for="emailAddress">Email address:</label>
            <input type="text" name="emailAddress" />
          </p>
          <p>
            <label for="emailSubject">Subject:</label>
            <input type="text" name="emailSubject" />
          </p>
          <p>
            <label for="emailBody">Text to send:</label><br/>
            <textarea name="emailBody" rows="6"></textarea>
          </p>
        <p><input type="submit" value="Send!" /></p>
        @if(IsPost){
            <p>@message</p>
        }
        </form>
      </body>
    </html>
    
  7. Eseguire la pagina TestEmail.cshtml in un browser.

  8. Compilare i campi per inviare un messaggio di posta elettronica e quindi fare clic su Invia.

  9. Controllare il messaggio di posta elettronica per assicurarsi di aver ricevuto il messaggio.

La parte importante di questo esempio è che le impostazioni che in genere non si modificano, ad esempio il nome del server SMTP e le credenziali di posta elettronica, vengono impostate nel file _AppStart.cshtml . In questo modo non è necessario impostarli di nuovo in ogni pagina in cui si invia un messaggio di posta elettronica. Anche se per qualche motivo è necessario modificare tali impostazioni, è possibile impostarli singolarmente in una pagina. Nella pagina vengono impostati solo i valori che in genere cambiano ogni volta, ad esempio il destinatario e il corpo del messaggio di posta elettronica.

Esecuzione di codice prima e dopo i file in una cartella

Proprio come è possibile usare _AppStart.cshtml per scrivere codice prima delle pagine nell'esecuzione del sito, è possibile scrivere codice eseguito prima (e dopo) qualsiasi pagina in una determinata cartella eseguita. Ciò è utile per gli elementi come l'impostazione della stessa pagina di layout per tutte le pagine di una cartella o per verificare che un utente sia connesso prima di eseguire una pagina nella cartella.

Per le pagine in cartelle specifiche, è possibile creare codice in un file denominato _PageStart.cshtml. Il diagramma seguente illustra il funzionamento della pagina _PageStart.cshtml . Quando una richiesta viene visualizzata per una pagina, ASP.NET prima verifica la presenza di una pagina _AppStart.cshtml ed esegue questa operazione. Quindi ASP.NET verifica se è presente una pagina _PageStart.cshtml e, in caso affermativo, viene eseguito. Esegue quindi la pagina richiesta.

All'interno della pagina _PageStart.cshtml è possibile specificare dove durante l'elaborazione si vuole che la pagina richiesta venga eseguita includendo un RunPage metodo. In questo modo è possibile eseguire il codice prima dell'esecuzione della pagina richiesta e quindi nuovamente dopo di esso. Se non si include RunPage, tutto il codice in _PageStart.cshtml viene eseguito automaticamente e la pagina richiesta viene eseguita automaticamente.

[Immagine che mostra come verrà eseguita automaticamente la pagina richiesta.]

ASP.NET consente di creare una gerarchia di file _PageStart.cshtml . È possibile inserire un file _PageStart.cshtml nella radice del sito e in qualsiasi sottocartella. Quando viene richiesta una pagina, il file _PageStart.cshtml al livello superiore (più vicino alla radice del sito) viene eseguito, seguito dal file _PageStart.cshtml nella sottocartella successiva e così via fino a quando la richiesta non raggiunge la cartella che contiene la pagina richiesta. Dopo l'esecuzione di tutti i file _PageStart.cshtml applicabili, la pagina richiesta viene eseguita.

Ad esempio, potrebbe essere disponibile la combinazione seguente di file _PageStart.cshtml e del file Default.cshtml :

@* ~/_PageStart.cshtml *@
@{
  PageData["Color1"] = "Red";
  PageData["Color2"] = "Blue";
}
@* ~/myfolder/_PageStart.cshtml *@
@{
  PageData["Color2"] = "Yellow";
  PageData["Color3"] = "Green";
}
@* ~/myfolder/default.cshtml *@
@PageData["Color1"]
<br/>
@PageData["Color2"]
<br/>
@PageData["Color3"]

Quando si esegue /myfolder/default.cshtml, verrà visualizzato quanto segue:

Red

Yellow

Green

Esecuzione del codice di inizializzazione per tutte le pagine in una cartella

Un buon uso per i file _PageStart.cshtml consiste nell'inizializzare la stessa pagina di layout per tutti i file in una singola cartella.

  1. Nella cartella radice creare una nuova cartella denominata InitPages.

  2. Nella cartella InitPages del sito Web creare un file denominato _PageStart.cshtml e sostituire il markup e il codice predefiniti con quanto segue:

    @{
        // Sets the layout page for all pages in the folder.
        Layout = "~/Shared/_Layout1.cshtml";
    
        // Sets a variable available to all pages in the folder.
        PageData["MyBackground"] = "Yellow";
    }
    
  3. Nella radice del sito Web creare una cartella denominata Shared.

  4. Nella cartella Condivisa creare un file denominato _Layout1.cshtml e sostituire il markup e il codice predefiniti con quanto segue:

    @{
      var backgroundColor = PageData["MyBackground"];
    }
    <!DOCTYPE html>
    <html>
    <head>
      <title>Page Title</title>
      <link type="text/css" href="/Styles/Site.css" rel="stylesheet" />
    </head>
    <body>
      <div id="header">
        Using the _PageStart.cshtml file
      </div>
      <div id="main" style="background-color:@backgroundColor">
        @RenderBody()
      </div>
    <div id="footer">
      &copy; 2012 Contoso. All rights reserved
    </div>
    </body>
    </html>
    
  5. Nella cartella InitPages creare un file denominato Content1.cshtml e sostituire il contenuto esistente con quanto segue:

    <p>This is content page 1.</p>
    
  6. Nella cartella InitPages creare un altro file denominato Content2.cshtml e sostituire il markup predefinito con quanto segue:

    <p>This is content page 2.</p>
    
  7. Eseguire Content1.cshtml in un browser.

    [Immagine che mostra l'esecuzione di Content 1 dot CSHTML in un browser.]

    Quando viene eseguita la pagina Content1.cshtml , il file _PageStart.cshtml imposta Layout e imposta PageData["MyBackground"] anche un colore. In Content1.cshtml vengono applicati il layout e il colore.

  8. Visualizzare Content2.cshtml in un browser.

    Il layout è lo stesso, perché entrambe le pagine usano la stessa pagina di layout e il colore inizializzati in _PageStart.cshtml.

Uso di _PageStart.cshtml per gestire gli errori

Un altro buon uso per il file _PageStart.cshtml consiste nel creare un modo per gestire gli errori di programmazione (eccezioni) che possono verificarsi in qualsiasi pagina con estensione cshtml in una cartella. In questo esempio viene illustrato un modo per eseguire questa operazione.

  1. Nella cartella radice creare una cartella denominata InitCatch.

  2. Nella cartella InitCatch del sito Web creare un file denominato _PageStart.cshtml e sostituire il markup e il codice esistenti con quanto segue:

    @{
        try
        {
            RunPage();
        }
        catch (Exception ex)
        {
            Response.Redirect("~/Error.cshtml?source=" +
                HttpUtility.UrlEncode(Request.AppRelativeCurrentExecutionFilePath));
        }
    }
    

    In questo codice si tenta di eseguire la pagina richiesta in modo esplicito chiamando il RunPage metodo all'interno di un try blocco. Se si verificano errori di programmazione nella pagina richiesta, viene eseguito il codice all'interno del catch blocco. In questo caso, il codice reindirizza a una pagina (Error.cshtml) e passa il nome del file che ha riscontrato l'errore come parte dell'URL. La pagina verrà creata a breve.

  3. Nella cartella InitCatch del sito Web creare un file denominato Exception.cshtml e sostituire il markup e il codice esistenti con quanto segue:

    @{
        var db = Database.Open("invalidDatabaseFile");
    }
    

    Ai fini di questo esempio, le operazioni che si stanno eseguendo in questa pagina creano deliberatamente un errore provando ad aprire un file di database che non esiste.

  4. Nella cartella radice creare un file denominato Error.cshtml e sostituire il markup e il codice esistenti con quanto segue:

    <!DOCTYPE html>
    <html>
        <head>
            <title>Error Page</title>
        </head>
        <body>
    <h1>Error report</h1>
    <p>An error occurred while running the following file: @Request["source"]</p>
        </body>
    </html>
    

    In questa pagina l'espressione @Request["source"] ottiene il valore dall'URL e lo visualizza.

  5. Nella barra degli strumenti fare clic su Salva.

  6. Eseguire Exception.cshtml in un browser.

    [Screenshot che mostra l'esecuzione di Exception dot CSHTML in un browser.]

    Poiché si verifica un errore in Exception.cshtml, la pagina _PageStart.cshtml reindirizza al file Error.cshtml , che visualizza il messaggio.

    Per altre informazioni sulle eccezioni, vedere Introduzione alla programmazione Pagine Web ASP.NET tramite la sintassi Razor.

Uso di _PageStart.cshtml per limitare l'accesso alle cartelle

È anche possibile usare il file _PageStart.cshtml per limitare l'accesso a tutti i file in una cartella.

  1. In WebMatrix creare un nuovo sito Web usando l'opzione Sito da modello .

  2. Nei modelli disponibili selezionare Sito iniziale.

  3. Nella cartella radice creare una cartella denominata AuthenticatedContent.

  4. Nella cartella AuthenticatedContent creare un file denominato _PageStart.cshtml e sostituire il markup e il codice esistenti con quanto segue:

    @{
        Response.CacheControl = "no-cache";
        if (!WebSecurity.IsAuthenticated) {
            var returnUrl = "~/Account/Login?ReturnUrl=" + Request.Url.LocalPath;
            Response.Redirect(returnUrl);
        }
    }
    

    Il codice inizia impedendo che tutti i file nella cartella vengano memorizzati nella cache. Questa operazione è necessaria per scenari come i computer pubblici, in cui non si vuole che le pagine memorizzate nella cache di un utente siano disponibili per l'utente successivo. Successivamente, il codice determina se l'utente ha eseguito l'accesso al sito prima di poter visualizzare una qualsiasi delle pagine nella cartella. Se l'utente non ha eseguito l'accesso, il codice viene reindirizzato alla pagina di accesso. La pagina di accesso può restituire l'utente alla pagina richiesta in origine se si include un valore di stringa di query denominato ReturnUrl.

  5. Creare una nuova pagina nella cartella AuthenticatedContent denominataPage.cshtml.

  6. Sostituire il markup predefinito con quanto segue:

    @{
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Authenticated Content";
    }
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
      </head>
      <body>
        Thank you for authenticating!
      </body>
    </html>
    
  7. Eseguire Page.cshtml in un browser. Il codice reindirizza l'utente a una pagina di accesso. È necessario registrarsi prima di eseguire l'accesso. Dopo aver eseguito la registrazione e l'accesso, è possibile passare alla pagina e visualizzarne il contenuto.

Risorse aggiuntive

Introduzione alla programmazione Pagine Web ASP.NET con la sintassi Razor