Настройка поведения Site-Wide для сайтов веб-страницы ASP.NET (Razor)

; автор — Том ФитцМакен (Tom FitzMacken)

В этой статье объясняется, как настроить параметры на стороне сайта для страниц на веб-сайте веб-страницы ASP.NET (Razor).

Из этого руководства вы узнаете, как выполнять такие задачи:

  • Выполнение кода, который позволяет задавать значения (глобальные значения или вспомогательные параметры) для всех страниц сайта.
  • Выполнение кода, который позволяет задавать значения для всех страниц в папке.
  • Выполнение кода до и после загрузки страницы.
  • Отправка ошибок на центральную страницу ошибок.
  • Добавление проверки подлинности на все страницы в папке.

Версии программного обеспечения, используемые в этом руководстве

  • веб-страницы ASP.NET (Razor) 2
  • WebMatrix 3
  • Библиотека веб-помощников ASP.NET (пакет NuGet)

Это руководство также работает с веб-страницы ASP.NET 3 и Visual Studio 2013 (или Visual Studio Express 2013 для Web), за исключением того, что вы не можете использовать библиотеку веб-помощников ASP.NET.

Добавление кода запуска веб-сайта для веб-страницы ASP.NET

Для большей части кода, написанного в веб-страницы ASP.NET, отдельная страница может содержать весь код, необходимый для этой страницы. Например, если страница отправляет сообщение электронной почты, можно поместить весь код для этой операции в одну страницу. Сюда может входить код для инициализации параметров отправки электронной почты (то есть для SMTP-сервера) и отправки сообщения электронной почты.

Однако в некоторых ситуациях может потребоваться выполнить код перед выполнением любой страницы на сайте. Это полезно для настройки значений, которые можно использовать в любом месте сайта (называемые глобальными значениями). Например, для некоторых вспомогательных служб требуется указать такие значения, как параметры электронной почты или ключи учетной записи. Эти параметры удобно хранить в глобальных значениях.

Это можно сделать, создав страницу с именем _AppStart.cshtml в корне сайта. Если эта страница существует, она запускается при первом запросе любой страницы на сайте. Поэтому это хорошее место для выполнения кода для задания глобальных значений. (Так как _AppStart.cshtml имеет префикс подчеркивания, ASP.NET не отправляет страницу в браузер, даже если пользователи запрашивают ее напрямую.)

На следующей схеме показано, как работает страница _AppStart.cshtml . При появлении запроса на страницу и если это первый запрос для любой страницы сайта, ASP.NET сначала проверяет, существует ли страница _AppStart.cshtml . Если это так, выполняется любой код на странице _AppStart.cshtml , а затем выполняется запрошенная страница.

[На рисунке показано, как работает точка App Star CSHTML.]

Настройка глобальных значений для веб-сайта

  1. В корневой папке веб-сайта WebMatrix создайте файл с именем _AppStart.cshtml. Файл должен находиться в корне сайта.

  2. Замените существующее содержимое следующим:

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

    Этот код сохраняет значение в словаре AppState , который автоматически доступен для всех страниц сайта. Обратите внимание, что в файле _AppStart.cshtml нет разметки. Страница запустит код, а затем перенаправит на страницу, которая была первоначально запрошена.

    Примечание

    Будьте внимательны при вставке кода в файл _AppStart.cshtml . Если в коде в файле _AppStart.cshtml возникают ошибки, веб-сайт не запускается.

  3. В корневой папке создайте страницу с именем AppName.cshtml.

  4. Замените разметку и код по умолчанию следующим кодом:

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

    Этот код извлекает значение из объекта, заданного AppState на странице _AppStart.cshtml .

  5. Запустите страницу AppName.cshtml в браузере. (Перед запуском убедитесь, что страница выбрана в рабочей области Файлы .) На странице отображается глобальное значение.

    [Снимок экрана: страница с глобальным значением.]

Настройка значений для вспомогательных элементов

Файл _AppStart.cshtml можно использовать для задания значений вспомогательных элементов, используемых на сайте и которые необходимо инициализировать. Типичными примерами являются параметры электронной почты для вспомогательной WebMail службы и закрытые и открытые ключи для вспомогательной ReCaptcha службы. В таких случаях можно задать значения один раз в файле _AppStart.cshtml , а затем они уже заданы для всех страниц сайта.

В этой процедуре показано, как глобально задать WebMail параметры. (Дополнительные сведения об использовании вспомогательной функции см. в WebMail статье Добавление Email на сайт веб-страницы ASP.NET.)

  1. Добавьте библиотеку веб-помощников ASP.NET на веб-сайт, как описано в разделе Установка вспомогательных служб на сайте веб-страницы ASP.NET, если вы еще не добавили ее.

  2. Если у вас еще нет файла _AppStart.cshtml , в корневой папке веб-сайта создайте файл с именем _AppStart.cshtml.

  3. Добавьте следующие WebMail параметры в файл _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";
    }
    

    Измените следующие параметры, связанные с электронной почтой, в коде:

  4. Сохраните файл _AppStart.cshtml и закройте его.

  5. В корневой папке веб-сайта создайте страницу с именем TestEmail.cshtml.

  6. Замените существующее содержимое следующим:

    @{
        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. Запустите страницу TestEmail.cshtml в браузере.

  8. Заполните поля, чтобы отправить себе сообщение электронной почты, и нажмите кнопку Отправить.

  9. Проверьте сообщение электронной почты, чтобы убедиться, что вы получили сообщение.

Важной частью этого примера является то, что параметры, которые обычно не изменяются( например, имя SMTP-сервера и учетные данные электронной почты), задаются в файле _AppStart.cshtml . Таким образом, вам не нужно снова задавать их на каждой странице, где вы отправляете сообщение электронной почты. (Хотя если по какой-либо причине вам нужно изменить эти параметры, их можно задать по отдельности на странице.) На странице задаются только те значения, которые обычно изменяются каждый раз, например получатель и текст сообщения электронной почты.

Выполнение кода до и после файлов в папке

Так же, как вы можете использовать _AppStart.cshtml для написания кода перед выполнением страниц сайта, вы можете написать код, который выполняется до (и после) любой страницы в определенной папке. Это полезно для таких действий, как установка одной и той же страницы макета для всех страниц в папке или проверка входа пользователя перед запуском страницы в папке.

Для страниц в определенных папках можно создать код в файле с именем _PageStart.cshtml. На следующей схеме показано, как работает страница _PageStart.cshtml . При появлении запроса на страницу ASP.NET сначала проверяет наличие страницы _AppStart.cshtml и выполняет ее. Затем ASP.NET проверяет, есть ли страница _PageStart.cshtml , и если да, выполняет ее. Затем выполняется запрошенная страница.

На странице _PageStart.cshtml можно указать, где во время обработки требуется выполнить запрошенную страницу, включив RunPage метод . Это позволяет выполнять код перед выполнением запрошенной страницы, а затем снова после нее. Если не включить RunPage, весь код в _PageStart.cshtml выполняется, а запрошенная страница запускается автоматически.

[На рисунке показано, как запрашиваемая страница будет запускаться автоматически.]

ASP.NET позволяет создать иерархию файлов _PageStart.cshtml . Файл _PageStart.cshtml можно поместить в корень сайта и в любую вложенную папку. При запросе страницы запускается файл _PageStart.cshtml на самом верхнем уровне (ближе всего к корню сайта), за которым следует файл _PageStart.cshtml в следующей вложенной папке, и так далее вниз по структуре вложенной папки, пока запрос не достигнет папки, содержащей запрошенную страницу. После запуска всех применимых файлов _PageStart.cshtml выполняется запрошенная страница.

Например, у вас может быть следующее сочетание файлов _PageStart.cshtml и 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"]

При запуске /myfolder/default.cshtml вы увидите следующее:

Red

Yellow

Green

Выполнение кода инициализации для всех страниц в папке

Для файлов _PageStart.cshtml рекомендуется инициализировать одну и ту же страницу макета для всех файлов в одной папке.

  1. В корневой папке создайте папку с именем InitPages.

  2. В папке InitPages на веб-сайте создайте файл с именем _PageStart.cshtml и замените разметку и код по умолчанию следующими:

    @{
        // 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. В корне веб-сайта создайте папку с именем Shared.

  4. В папке Общие создайте файл с именем _Layout1.cshtml и замените разметку и код по умолчанию следующими:

    @{
      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. В папке InitPages создайте файл с именем Content1.cshtml и замените существующее содержимое следующим:

    <p>This is content page 1.</p>
    
  6. В папке InitPages создайте другой файл с именем Content2.cshtml и замените разметку по умолчанию следующим:

    <p>This is content page 2.</p>
    
  7. Запустите Файл Content1.cshtml в браузере.

    [На рисунке показано выполнение CSHTML-файла content 1 в браузере.]

    При запуске страницы Content1.cshtml файл _PageStart.cshtml задает Layout и задает PageData["MyBackground"] цвет. В Content1.cshtml применяются макет и цвет.

  8. Отображение файла Content2.cshtml в браузере.

    Макет одинаков, так как на обеих страницах используется один и тот же цвет страницы макета, что и инициализировано в _PageStart.cshtml.

Использование _PageStart.cshtml для обработки ошибок

Еще одно полезное использование файла _PageStart.cshtml — создание способа обработки ошибок программирования (исключений), которые могут возникнуть на любой странице .cshtml в папке. В этом примере показан один из способов сделать это.

  1. В корневой папке создайте папку с именем InitCatch.

  2. В папке InitCatch веб-сайта создайте файл с именем _PageStart.cshtml и замените существующую разметку и код следующим кодом:

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

    В этом коде вы пытаетесь выполнить запрошенную страницу явным образом, вызвав RunPage метод внутри try блока. Если на запрошенной странице возникают ошибки программирования, выполняется код внутри catch блока. В этом случае код перенаправляется на страницу (Error.cshtml) и передает имя файла, в который произошла ошибка, как часть URL-адреса. (Вы создадите страницу в ближайшее время.)

  3. В папке InitCatch веб-сайта создайте файл с именем Exception.cshtml и замените существующую разметку и код следующим кодом:

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

    В этом примере вы намеренно создаете ошибку, пытаясь открыть несуществующий файл базы данных.

  4. В корневой папке создайте файл с именем Error.cshtml и замените существующую разметку и код следующим кодом:

    <!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>
    

    На этой странице выражение @Request["source"] получает значение из URL-адреса и отображает его.

  5. На панели инструментов нажмите кнопку Сохранить.

  6. Запустите Файл Exception.cshtml в браузере.

    [Снимок экрана: запуск CSHTML исключения в браузере.]

    Так как в Файле Exception.cshtml возникает ошибка, страница _PageStart.cshtml перенаправляется в файл Error.cshtml , в котором отображается сообщение.

    Дополнительные сведения об исключениях см. в статье Общие сведения о программировании веб-страницы ASP.NET с помощью синтаксиса Razor.

Использование _PageStart.cshtml для ограничения доступа к папкам

Вы также можете использовать файл _PageStart.cshtml , чтобы ограничить доступ ко всем файлам в папке.

  1. В WebMatrix создайте новый веб-сайт с помощью параметра Сайт из шаблона .

  2. В доступных шаблонах выберите Начальный сайт.

  3. В корневой папке создайте папку с именем AuthenticatedContent.

  4. В папке AuthenticatedContent создайте файл с именем _PageStart.cshtml и замените существующую разметку и код следующим кодом:

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

    Код начинается с предотвращения кэширования всех файлов в папке. (Это необходимо для таких сценариев, как общедоступные компьютеры, когда вы не хотите, чтобы кэшированные страницы одного пользователя были доступны для следующего пользователя.) Затем код определяет, вошел ли пользователь на сайт, прежде чем сможет просматривать любую из страниц в папке. Если пользователь не вошел в систему, код перенаправляется на страницу входа. Страница входа может вернуть пользователя на страницу, которая была первоначально запрошена, если вы включили значение строки запроса с именем ReturnUrl.

  5. Создайте новую страницу в папке AuthenticatedContentс именем Page.cshtml.

  6. Замените разметку по умолчанию следующим кодом:

    @{
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Authenticated Content";
    }
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
      </head>
      <body>
        Thank you for authenticating!
      </body>
    </html>
    
  7. Запустите Файл Page.cshtml в браузере. Код перенаправляет вас на страницу входа. Перед входом в систему необходимо зарегистрироваться. После регистрации и входа в систему можно перейти на страницу и просмотреть ее содержимое.

Дополнительные ресурсы

Общие сведения о программировании веб-страницы ASP.NET с использованием синтаксиса Razor