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

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

В этой статье приведены общие сведения о программировании с помощью веб-страницы ASP.NET с использованием синтаксиса Razor. ASP.NET — это технология майкрософт для запуска динамических веб-страниц на веб-серверах. В этих статьях основное внимание уделяется использованию языка программирования C#.

Что вы узнаете:

  • 8 основных советов по программированию для начала работы с программированием веб-страницы ASP.NET с использованием синтаксиса Razor.
  • Вам понадобятся основные понятия программирования.
  • Что ASP.NET серверный код и синтаксис Razor.

Версии программного обеспечения

  • веб-страницы ASP.NET (Razor) 3

Это руководство также работает с веб-страницы ASP.NET 2.

8 лучших советов по программированию

В этом разделе перечислены некоторые советы, которые необходимо знать при написании кода сервера ASP.NET с использованием синтаксиса Razor.

Примечание

Синтаксис Razor основан на языке программирования C#, который чаще всего используется с веб-страницы ASP.NET. Однако синтаксис Razor также поддерживает язык Visual Basic, и все, что вы видите, вы также можете сделать в Visual Basic. Дополнительные сведения см. в приложении Язык и синтаксис Visual Basic.

Дополнительные сведения о большинстве этих методов программирования см. далее в этой статье.

1. Вы добавляете код на страницу с помощью символа @.

Символ @ запускает встроенные выражения, блоки с одним оператором и блоки с несколькими операторами:

<!-- Single statement blocks  -->
@{ var total = 7; }
@{ var myMessage = "Hello World"; }

<!-- Inline expressions -->
<p>The value of your account is: @total </p>
<p>The value of myMessage is: @myMessage</p>

<!-- Multi-statement block -->
@{
    var greeting = "Welcome to our site!";
    var weekDay = DateTime.Now.DayOfWeek;
    var greetingMessage = greeting + " Today is: " + weekDay;
}
<p>The greeting is: @greetingMessage</p>

Вот как выглядят эти инструкции при запуске страницы в браузере:

Razor-Img1

Совет

Кодирование HTML

При отображении содержимого на странице с помощью символа @ , как в предыдущих примерах, ASP.NET кодирует выходные данные в ФОРМАТЕ HTML. При этом зарезервированные символы HTML (такие как < и > ) &заменяются кодами, которые позволяют отображать символы на веб-странице в виде символов, а не как html-теги или сущности. Без кодирования HTML выходные данные серверного кода могут отображаться неправильно и подвергать страницу риску безопасности.

Если вы хотите вывести html-разметку, которая отображает теги в виде разметки (например <p></p> , для абзаца или <em></em> выделения текста), см. раздел Объединение текста, разметки и кода в блоках кода далее в этой статье.

Дополнительные сведения о кодировании HTML см. в статье Работа с формами.

2. Блоки кода заключаются в фигурные скобки

Блок кода включает один или несколько операторов кода и заключен в фигурные скобки.

<!-- Single statement block.  -->
@{ var theMonth = DateTime.Now.Month; }
<p>The numeric value of the current month: @theMonth</p>

<!-- Multi-statement block. -->
@{
    var outsideTemp = 79;
    var weatherMessage = "Hello, it is " + outsideTemp + " degrees.";
}
<p>Today's weather: @weatherMessage</p>

Результат, отображаемый в браузере:

Razor-Img2

3. Внутри блока каждый оператор кода заканчивается точкой с запятой

Внутри блока кода каждый полный оператор кода должен заканчиваться точкой с запятой. Встроенные выражения не заканчиваются точкой с запятой.

<!-- Single-statement block -->
@{ var theMonth = DateTime.Now.Month; }

<!-- Multi-statement block -->
@{
    var outsideTemp = 79;
    var weatherMessage = "Hello, it is " + outsideTemp + " degrees.";
}

<!-- Inline expression, so no semicolon -->
<p>Today's weather: @weatherMessage</p>

4. Для хранения значений используются переменные

В переменной можно хранить значения, включая строки, числа, даты и т. д. Новую переменную можно создать с помощью var ключевое слово. Значения переменных можно вставить непосредственно на страницу с помощью @.

<!-- Storing a string -->
@{ var welcomeMessage = "Welcome, new members!"; }
<p>@welcomeMessage</p>

<!-- Storing a date -->
@{ var year = DateTime.Now.Year; }

<!-- Displaying a variable -->
<p>Welcome to our new members who joined in @year!</p>

Результат, отображаемый в браузере:

Razor-Img3

5. Строковые литеральные значения заключаются в двойные кавычки

Строка — это последовательность символов, которые обрабатываются как текст. Чтобы указать строку, заключите ее в двойные кавычки:

@{ var myString = "This is a string literal"; }

Если строка, которую вы хотите отобразить, содержит символ обратной косой черты ( \ ) или двойные кавычки ( " ), используйте буквальный строковый литерал с @ префиксом оператора . (В C# символ \имеет особое значение, если не используется буквальный строковый литерал.)

<!-- Embedding a backslash in a string -->
@{ var myFilePath = @"C:\MyFolder\"; }
<p>The path is: @myFilePath</p>

Чтобы внедрить двойные кавычки, используйте буквальный строковый литерал и повторите кавычки:

<!-- Embedding double quotation marks in a string -->
@{ var myQuote = @"The person said: ""Hello, today is Monday."""; }
<p>@myQuote</p>

Вот результат использования обоих этих примеров на странице:

Razor-Img4

Примечание

Обратите внимание, что @ символ используется как для пометки буквальных строковых литералов в C#, так и для пометки кода на ASP.NET страницах.

6. Код учитывает регистр

В C# ключевые слова (такие как var, trueи if) и имена переменных чувствительны к регистру. В следующих строках кода создаются две разные переменные: lastName и LastName.

@{
    var lastName = "Smith";
    var LastName = "Jones";
}

Если объявить переменную как var lastName = "Smith"; и попытаться сослаться на нее на странице как @LastName, вы получите значение "Jones" вместо "Smith".

Примечание

В Visual Basic ключевые слова и переменные не чувствительны к регистру.

7. Большая часть кода включает объекты

Объект представляет собой объект, с помощью который можно программировать: страницу, текстовое поле, файл, изображение, веб-запрос, сообщение электронной почты, запись клиента (строку базы данных) и т. д. Объекты имеют свойства, описывающие их характеристики и которые можно прочитать или изменить: объект текстового поля имеет Text свойство (среди прочего), объект запроса имеет Url свойство, сообщение электронной почты имеет From свойство, а объект клиента имеет FirstName свойство . Объекты также имеют методы, которые являются "командами", которые они могут выполнять. Примеры включают метод объекта файла Save , метод объекта Rotate image и метод объекта Send электронной почты.

Вы часто работаете с Request объектом , который предоставляет такие сведения, как значения текстовых полей (полей формы) на странице, тип браузера, который сделал запрос, URL-адрес страницы, удостоверение пользователя и т. д. В следующем примере показано, как получить доступ к свойствам Request объекта и как вызвать MapPath метод Request объекта , который дает абсолютный путь к странице на сервере:

<table border="1">
<tr>
    <td>Requested URL</td>
    <td>Relative Path</td>
    <td>Full Path</td>
    <td>HTTP Request Type</td>
</tr>
<tr>
    <td>@Request.Url</td>
    <td>@Request.FilePath</td>
    <td>@Request.MapPath(Request.FilePath)</td>
    <td>@Request.RequestType</td>
</tr>
</table>

Результат, отображаемый в браузере:

Razor-Img5

8. Вы можете написать код, который принимает решения

Ключевой особенностью динамических веб-страниц является то, что вы можете определить, что делать на основе условий. Чаще всего это можно сделать с помощью if оператора (и необязательного else оператора).

@{
   var result = "";
   if(IsPost)
   {
      result = "This page was posted using the Submit button.";
   }
   else
   {
      result = "This was the first request for this page.";
   }
}

<!DOCTYPE html>
<html>
    <head>
        <title></title>
    </head>
<body>
<form method="POST" action="" >
  <input type="Submit" name="Submit" value="Submit"/>
  <p>@result</p>
</form>
</body>
</html>

if(IsPost) Оператор является сокращенным способом записи if(IsPost == true). Наряду с if операторами существует множество способов проверки условий, повторения блоков кода и т. д., которые описаны далее в этой статье.

Результат, отображаемый в браузере (после нажатия кнопки Отправить):

Razor-Img6

Совет

Методы HTTP GET и POST и свойство IsPost

Протокол, используемый для веб-страниц (HTTP), поддерживает очень ограниченное количество методов (команд), которые используются для выполнения запросов к серверу. Двумя наиболее распространенными из них являются GET, которая используется для чтения страницы, и POST, которая используется для отправки страницы. Как правило, при первом запросе пользователем страницы она запрашивается с помощью GET. Если пользователь заполняет форму, а затем нажимает кнопку "Отправить", браузер отправляет серверу запрос POST.

При веб-программировании часто бывает полезно узнать, запрашивается ли страница как GET или POST, чтобы вы знали, как обрабатывать страницу. В веб-страницы ASP.NET можно использовать IsPost свойство , чтобы узнать, является ли запрос get или POST. Если запрос является post, IsPost свойство возвращает значение true, и вы можете выполнять такие действия, как чтение значений текстовых полей в форме. Во многих примерах показано, как обрабатывать страницу по-разному в зависимости от значения IsPost.

Простой пример кода

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

  1. В редакторе создайте новый файл и назовите его AddNumbers.cshtml.

  2. Скопируйте приведенный ниже код и разметку на страницу, заменив все, что уже есть на странице.

    @{
        var total = 0;
        var totalMessage = "";
        if(IsPost) {
    
            // Retrieve the numbers that the user entered.
            var num1 = Request["text1"];
            var num2 = Request["text2"];
    
            // Convert the entered strings into integers numbers and add.
            total = num1.AsInt() + num2.AsInt();
            totalMessage = "Total = " + total;
        }
    }
    
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <title>Add Numbers</title>
        <meta charset="utf-8" />
        <style type="text/css">
          body {background-color: beige; font-family: Verdana, Arial;
                margin: 50px; }
          form {padding: 10px; border-style: solid; width: 250px;}
        </style>
      </head>
    <body>
      <p>Enter two whole numbers and then click <strong>Add</strong>.</p>
      <form action="" method="post">
        <p><label for="text1">First Number:</label>
          <input type="text" name="text1" />
        </p>
        <p><label for="text2">Second Number:</label>
          <input type="text" name="text2" />
        </p>
        <p><input type="submit" value="Add" /></p>
      </form>
    
      <p>@totalMessage</p>
    
    </body>
    </html>
    

    Ниже приведены некоторые моменты, которые следует отметить:

    • Символ @ запускает первый блок кода на странице и предшествует totalMessage переменной, внедренной в нижней части страницы.
    • Блок в верхней части страницы заключен в фигурные скобки.
    • В блоке в верхней части все строки заканчиваются точкой с запятой.
    • Переменные total, num1, num2и totalMessage хранят несколько чисел и строку.
    • Строковое литеральное значение, назначенное переменной totalMessage , находится в двойных кавычках.
    • Так как в коде учитывается регистр, при totalMessage использовании переменной в нижней части страницы ее имя должно точно соответствовать переменной вверху.
    • Выражение num1.AsInt() + num2.AsInt() показывает, как работать с объектами и методами. Метод AsInt для каждой переменной преобразует строку, введенную пользователем, в число (целое число), чтобы можно было выполнять с ней арифметические операции.
    • Тег <form> содержит method="post" атрибут . Это указывает, что при нажатии пользователем кнопки Добавить страница будет отправлена на сервер с помощью метода HTTP POST. При отправке страницы тест оценивается как true, if(IsPost) и условный код выполняется, отображая результат сложения чисел.
  3. Сохраните страницу и запустите ее в браузере. (Перед запуском убедитесь, что страница выбрана в рабочей области Файлы .) Введите два целых числа и нажмите кнопку Добавить .

    Razor-Img7

Основные понятия программирования

В этой статье представлен обзор веб-программирования ASP.NET. Это не исчерпывающий анализ, а просто краткий обзор концепций программирования, которые вы будете использовать чаще всего. Несмотря на это, он охватывает почти все, что потребуется для начала работы с веб-страницы ASP.NET.

Но сначала немного технического фона.

Синтаксис Razor, код сервера и ASP.NET

Синтаксис Razor — это простой синтаксис программирования для внедрения серверного кода в веб-страницу. На веб-странице, которая использует синтаксис Razor, существует два типа содержимого: содержимое клиента и серверный код. Клиентское содержимое — это содержимое, к которым вы привыкли на веб-страницах: разметка HTML (элементы), сведения о стиле, такие как CSS, некоторые клиентские скрипты, например JavaScript, и обычный текст.

Синтаксис Razor позволяет добавлять серверный код в содержимое этого клиента. Если на странице есть серверный код, то сервер сначала выполняет его перед отправкой страницы в браузер. Выполняя на сервере, код может выполнять задачи, которые могут быть гораздо сложнее использовать только клиентское содержимое, например доступ к серверным базам данных. Самое главное, серверный код может динамически создавать клиентское содержимое— он может создавать HTML-разметку или другое содержимое на лету, а затем отправлять его в браузер вместе со статическим HTML-кодом, который может содержаться на странице. Для браузера клиентское содержимое, созданное серверным кодом, не отличается от любого другого клиентского содержимого. Как вы уже видели, необходимый код сервера довольно прост.

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

Куда вписывается ASP.NET?

Синтаксис Razor основан на технологии корпорации Майкрософт под названием ASP.NET, которая, в свою очередь, основана на microsoft платформа .NET Framework. The.NET Framework — это обширная комплексная платформа программирования корпорации Майкрософт, предназначенная для разработки практически любого типа компьютерных приложений. ASP.NET — это часть платформа .NET Framework, специально предназначенная для создания веб-приложений. Разработчики использовали ASP.NET для создания многих крупнейших и самых больших веб-сайтов в мире. (Каждый раз, когда расширение имени файла .aspx отображается как часть URL-адреса на сайте, вы будете знать, что сайт был написан с помощью ASP.NET.)

Синтаксис Razor дает вам все возможности ASP.NET, но использование упрощенного синтаксиса, который проще изучить, если вы новичок, и что делает вас более продуктивным, если вы эксперт. Несмотря на то, что этот синтаксис прост в использовании, его семейное отношение к ASP.NET и платформа .NET Framework означает, что по мере того как ваши веб-сайты становятся все более сложными, у вас есть сила более крупных платформ, доступных вам.

Razor-Img8

Совет

Классы и экземпляры

ASP.NET серверном коде используются объекты , которые, в свою очередь, основаны на идее классов. Класс — это определение или шаблон для объекта . Например, приложение может содержать класс, определяющий Customer свойства и методы, необходимые любому объекту клиента.

Когда приложению необходимо работать с фактическими сведениями о клиенте, оно создает экземпляр (или создает экземпляр) объекта клиента. Каждый отдельный клиент является отдельным экземпляром Customer класса . Каждый экземпляр поддерживает одни и те же свойства и методы, но значения свойств для каждого экземпляра обычно различаются, так как каждый объект клиента уникален. В одном объекте клиента свойство может иметь значение "Smith", LastName а в другом объекте LastName клиента свойство может иметь значение "Jones".

Аналогичным образом, любая отдельная веб-страница на сайте является Page объектом, который является экземпляром Page класса . Кнопка на странице — это Button объект, который является экземпляром Button класса и т. д. Каждый экземпляр имеет свои собственные характеристики, но все они основаны на том, что указано в определении класса объекта.

Базовый синтаксис

Ранее вы видели базовый пример создания страницы веб-страницы ASP.NET и добавления серверного кода в разметку HTML. Здесь вы узнаете об основах написания ASP.NET серверного кода с использованием синтаксиса Razor, т. е. правил языка программирования.

Если у вас есть опыт программирования (особенно если вы использовали C, C++, C#, Visual Basic или JavaScript), многое из прочитанного здесь будет знакомо. Вам, вероятно, потребуется ознакомиться только с тем, как серверный код добавляется в разметку в CSHTML-файлах .

Объединение текста, разметки и кода в блоках кода

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

  • Заключите текст в элемент HTML, например <p></p> или <em></em>:

    @if(IsPost) {
        // This line has all content between matched <p> tags.
        <p>Hello, the time is @DateTime.Now and this page is a postback!</p>
    } else {
        // All content between matched tags, followed by server code.
        <p>Hello <em>stranger</em>, today is: <br /> </p>  @DateTime.Now
    }
    

    Элемент HTML может включать текст, дополнительные элементы HTML и выражения серверного кода. Когда ASP.NET видит открывающийся HTML-тег (например, <p>), он отрисовывает все, включая элемент и его содержимое, как есть, в браузере, разрешая выражения кода сервера по мере выполнения.

  • @: Используйте оператор или <text> элемент . Выводит @: одну строку содержимого, содержащую обычный текст или несовпадение тегов HTML; <text> элемент заключает несколько строк в выходные данные. Эти параметры полезны, если вы не хотите отображать ЭЛЕМЕНТ HTML в составе выходных данных.

    @if(IsPost) {
        // Plain text followed by an unmatched HTML tag and server code.
        @: The time is: <br /> @DateTime.Now
        <br/>
        // Server code and then plain text, matched tags, and more text.
        @DateTime.Now @:is the <em>current</em> time.
    }
    

    Если вы хотите вывести несколько строк текста или несовпадения тегов HTML, перед каждой строкой @:можно использовать или заключить строку в <text> элемент . Как и @: оператор ,<text> теги используются ASP.NET для идентификации текстового содержимого и никогда не отображаются в выходных данных страницы.

    @if(IsPost) {
        // Repeat the previous example, but use <text> tags.
        <text>
        The time is: <br /> @DateTime.Now
        <br/>
        @DateTime.Now is the <em>current</em> time.
        </text>
    }
    
    @{
        var minTemp = 75;
        <text>It is the month of @DateTime.Now.ToString("MMMM"), and
        it's a <em>great</em> day! <br /><p>You can go swimming if it's at
        least @minTemp degrees. </p></text>
    }
    

    Первый пример повторяет предыдущий пример, но использует одну пару тегов <text> для заключения текста для отрисовки. Во втором примере <text> теги и </text> заключают три строки, все из которых имеют некоторые незадернутые текст и несовпаденные html-теги (<br />), а также серверный код и совпадающие html-теги. Опять же, вы также можете предварять каждую строку по отдельности @: с помощью оператора; в любом случае это работает.

    Примечание

    При выводе текста, как показано в этом разделе, с помощью элемента HTML, @: оператора или <text> элемента, ASP.NET не кодирует выходные данные в формате HTML. (Как отмечалось ранее, ASP.NET кодирует выходные данные выражений кода сервера и блоков кода сервера, которым предшествует @, за исключением особых случаев, указанных в этом разделе.)

Пробелы

Дополнительные пробелы в операторе (и за пределами строкового литерала) не влияют на оператор :

@{ var lastName =    "Smith"; }

Разрыв строки в операторе не влияет на оператор, и вы можете обтекать операторы для удобства чтения. Следующие инструкции равнозначны:

@{ var theName =
"Smith"; }

@{
    var
    personName
    =
    "Smith"
    ;
}

Однако вы не можете упаковать строку в середине строкового литерала. Следующий пример не работает:

@{ var test = "This is a long
    string"; }  // Does not work!

Чтобы объединить длинную строку, которая заключает в несколько строк, как в приведенном выше коде, есть два варианта. Вы можете использовать оператор объединения (+), который вы увидите далее в этой статье. Вы также можете использовать @ символ для создания буквального строкового литерала, как было показано ранее в этой статье. Можно разбить буквальные строковые литералы между строками:

@{ var longString = @"This is a
    long
    string";
}

Комментарии к коду (и разметке)

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

Существует другой синтаксис комментариев для кода Razor и html-разметки. Как и в случае со всем кодом Razor, комментарии Razor обрабатываются (а затем удаляются) на сервере перед отправкой страницы в браузер. Таким образом, синтаксис комментариев Razor позволяет помещать комментарии в код (или даже в разметку), которые можно увидеть при редактировании файла, но пользователи не видят даже в источнике страницы.

Для ASP.NET примечаний Razor вы начинаете комментарий с @* и заканчиваете его на *@. Комментарий может находиться в одной строке или нескольких строках:

@*  A one-line code comment. *@

@*
    This is a multiline code comment.
    It can continue for any number of lines.
*@

Ниже приведен комментарий в блоке кода:

@{
    @* This is a comment. *@
    var theVar = 17;
}

Вот тот же блок кода с закомментированной строкой кода, чтобы она не выполнялась:

@{
    @* This is a comment. *@
    @* var theVar = 17;  *@
}

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

@{
    // This is a comment.
    var myVar = 17;
    /* This is a multi-line comment
    that uses C# commenting syntax. */
}

В C# однострочные комментарии предшествуют // символы, а многострочные комментарии начинаются с /* и заканчиваются на */. (Как и в случае с комментариями Razor, комментарии C# не отображаются в браузере.)

Для разметки, как вы, вероятно, знаете, можно создать HTML-комментарий:

<!-- This is a comment.  -->

Html-комментарии начинаются с <!-- символов и заканчиваются на -->. С помощью HTML-комментариев можно заключить не только текст, но и любую разметку HTML, которую вы можете сохранить на странице, но не хотите отображать. Этот html-комментарий скрывает все содержимое тегов и текст, который они содержат:

<!-- <p>This is my paragraph.</p>  -->

В отличие от комментариев Razor, HTML-комментарии отображаются на странице, и пользователь может увидеть их, просмотрев источник страницы.

Razor имеет ограничения на вложенные блоки C#. Дополнительные сведения см. в разделе Именованные переменные C# и вложенные блоки создают неработающий код.

Переменные

Переменная — это именованный объект, который используется для хранения данных. Переменным можно присвоить любое имя, но имя должно начинаться с буквы и не может содержать пробелы или зарезервированные символы.

Переменные и типы данных

Переменная может иметь определенный тип данных, который указывает, какой тип данных хранится в переменной. У вас могут быть строковые переменные, в которых хранятся строковые значения (например, Hello world), целочисленные переменные, в которых хранятся целые числовые значения (например, 3 или 79), и переменные даты, которые хранят значения дат в различных форматах (например, 12.04.2012 или март 2009 г.). Существует множество других типов данных, которые можно использовать.

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

Переменная объявляется с помощью var ключевое слово (если вы не хотите указывать тип) или с помощью имени типа:

@{
    // Assigning a string to a variable.
    var greeting = "Welcome!";

    // Assigning a number to a variable.
    var theCount = 3;

    // Assigning an expression to a variable.
    var monthlyTotal = theCount + 5;

    // Assigning a date value to a variable.
    var today = DateTime.Today;

    // Assigning the current page's URL to a variable.
    var myPath = this.Request.Url;

    // Declaring variables using explicit data types.
    string name = "Joe";
    int count = 5;
    DateTime tomorrow = DateTime.Now.AddDays(1);
}

В следующем примере показаны некоторые типичные способы использования переменных на веб-странице:

@{
    // Embedding the value of a variable into HTML markup.
    <p>@greeting, friends!</p>

    // Using variables as part of an inline expression.
    <p>The predicted annual total is: @( monthlyTotal * 12)</p>

    // Displaying the page URL with a variable.
    <p>The URL to this page is: @myPath</p>
}

Если вы объединяете предыдущие примеры на странице, вы увидите следующее в браузере:

Razor-Img9

Преобразование и тестирование типов данных

Хотя ASP.NET обычно могут определять тип данных автоматически, иногда это не так. Поэтому может потребоваться помочь ASP.NET, выполнив явное преобразование. Даже если вам не нужно преобразовывать типы, иногда полезно проверить, с каким типом данных вы можете работать.

Наиболее распространенным случаем является преобразование строки в другой тип, например в целое число или дату. В следующем примере показан типичный случай, когда необходимо преобразовать строку в число.

@{
    var total = 0;

    if(IsPost) {
        // Retrieve the numbers that the user entered.
        var num1 = Request["text1"];
        var num2 = Request["text2"];
        // Convert the entered strings into integers numbers and add.
        total = num1.AsInt() + num2.AsInt();
    }
}

Как правило, пользовательский ввод поступает в виде строк. Даже если вы предлагаете пользователям ввести число и даже если они ввели цифру, когда введенные пользователем данные отправлены и вы читаете их в коде, данные будут в строковом формате. Поэтому необходимо преобразовать строку в число. В примере при попытке выполнить арифметические действия со значениями без их преобразования возникает следующая ошибка, так как ASP.NET не удается добавить две строки:

Не удается неявно преобразовать тип "string" в "int".

Чтобы преобразовать значения в целые числа, вызовите AsInt метод . Если преобразование выполнено успешно, можно добавить числа.

В следующей таблице перечислены некоторые распространенные методы преобразования и тестирования для переменных.

Метод

Описание

Пример


AsInt(), IsInt()

Преобразует строку, представляющую целое число (например, "593"), в целое число.

var myIntNumber = 0;
var myStringNum = "539";
if(myStringNum.IsInt()==true){
    myIntNumber = myStringNum.AsInt();
}

AsBool(), IsBool()

Преобразует строку типа true или false в логический тип.

var myStringBool = "True";
var myVar = myStringBool.AsBool();

AsFloat(), IsFloat()

Преобразует строку, которая имеет десятичное значение, например "1,3" или "7,439", в число с плавающей запятой.

var myStringFloat = "41.432895";
var myFloatNum = myStringFloat.AsFloat();

AsDecimal(), IsDecimal()

Преобразует строку, которая имеет десятичное значение, например "1,3" или "7,439", в десятичное число. (В ASP.NET десятичное число является более точным, чем число с плавающей запятой.)

var myStringDec = "10317.425";
var myDecNum = myStringDec.AsDecimal();

AsDateTime(), IsDateTime()

Преобразует строку, представляющую значение даты и времени, в тип ASP.NET DateTime .

var myDateString = "12/27/2012";
var newDate = myDateString.AsDateTime();

ToString()

Преобразует любой другой тип данных в строку.

int num1 = 17;
int num2 = 76;
// myString is set to 1776
string myString = num1.ToString() +
  num2.ToString();

Операторы

Оператор — это ключевое слово или символ, который сообщает ASP.NET, какую команду следует выполнить в выражении. Язык C# (и основанный на нем синтаксис Razor) поддерживает множество операторов, но для начала работы необходимо распознать только некоторые из них. В следующей таблице перечислены наиболее распространенные операторы.

Оператор

Описание

Примеры


+ - * /

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

@(5 + 13)
@{ var netWorth = 150000; }
@{ var newTotal = netWorth * 2; }
@(newTotal / 2)

=

Присваивание. Присваивает значение в правой части оператора объекту слева.

var age = 17;

==

Равенство. Возвращает значение true , если значения равны. (Обратите внимание на различие между оператором = и оператором == .)

var myNum = 15;
if (myNum == 15) {
    // Do something.
}

!=

Неравенство. Возвращает значение true , если значения не равны.

var theNum = 13;
if (theNum != 15) {
    // Do something.
}

< > <= >=

Меньше, больше, меньше или равно и больше или равно.

if (2 < 3) {
    // Do something.
}
var currentCount = 12;
if(currentCount >= 12) {
    // Do something.
}

+

Объединение, которое используется для соединения строк. ASP.NET знает разницу между этим оператором и оператором сложения на основе типа данных выражения.

// The displayed result is "abcdef".
@("abc" + "def")

+= -=

Операторы приращения и уменьшения, которые складывают и вычитают 1 (соответственно) из переменной.

int theCount = 0;
theCount += 1; // Adds 1 to count

.

Точка. Используется для различения объектов, их свойств и методов.

var myUrl = Request.Url;
var count = Request["Count"].AsInt();

()

Скобки. Используется для группировки выражений и передачи параметров в методы.

@(3 + 7)
@Request.MapPath(Request.FilePath);

[]

Скобки. Используется для доступа к значениям в массивах или коллекциях.

var income = Request["AnnualIncome"];

!

НЕ. Отменяет true значение на false и наоборот. Обычно используется в качестве сокращенного способа проверки ( false то есть для не true).

bool taskCompleted = false;
// Processing.
if(!taskCompleted) {
    // Continue processing
}

&& ||

Логические И и ИЛИ, которые используются для связывания условий.

bool myTaskCompleted = false;
int totalCount = 0;
// Processing.
if(!myTaskCompleted && totalCount < 12) {
    // Continue processing.
}

Работа с путями к файлам и папкам в коде

Вы часто работаете с путями к файлам и папкам в коде. Ниже приведен пример физической структуры папок для веб-сайта, которая может отображаться на компьютере разработки:

C:\WebSites\MyWebSite default.cshtml datafile.txt \images Logo.jpg \styles Styles.css

Ниже приведены некоторые важные сведения о URL-адресах и путях.

  • URL-адрес начинается с доменного имени (http://www.example.com) или имени сервера (http://localhost, http://mycomputer).
  • URL-адрес соответствует физическому пути на хост-компьютере. Например, http://myserver может соответствовать папке C:\websites\mywebsite на сервере.
  • Виртуальный путь является сокращенным для представления путей в коде без указания полного пути. Он включает часть URL-адреса, следующую за доменом или именем сервера. При использовании виртуальных путей вы можете переместить код в другой домен или на другой сервер без необходимости обновлять пути.

Ниже приведен пример, который поможет вам понять различия.

Полный URL-адрес http://mycompanyserver/humanresources/CompanyPolicy.htm
Имя сервера mycompanyserver
Виртуальный путь /humanresources/CompanyPolicy.htm
Физический путь C:\mywebsites\humanresources\CompanyPolicy.htm

Виртуальный корень — /, как и корень диска C: . (В путях к виртуальным папкам всегда используются косые черты.) Виртуальный путь к папке не обязательно должен иметь то же имя, что и физическая папка; это может быть псевдоним. (На рабочих серверах виртуальный путь редко совпадает с точным физическим путем.)

При работе с файлами и папками в коде иногда требуется ссылаться на физический путь, а иногда и на виртуальный, в зависимости от того, с какими объектами вы работаете. ASP.NET предоставляет следующие средства для работы с путями к файлам и папкам в коде Server.MapPath : метод, ~ оператор и Href метод.

Преобразование виртуальных путей в физические: метод Server.MapPath

Метод Server.MapPath преобразует виртуальный путь (например , /default.cshtml) в абсолютный физический путь (например , C:\WebSites\MyWebSiteFolder\default.cshtml). Этот метод используется каждый раз, когда требуется полный физический путь. Типичный пример — чтение или запись текстового файла или файла изображения на веб-сервере.

Как правило, вы не знаете абсолютный физический путь к сайту на сервере хост-сайта, поэтому этот метод может преобразовать известный путь (виртуальный путь) в соответствующий путь на сервере. Вы передаете виртуальный путь к файлу или папке методу , и он возвращает физический путь:

@{
    var dataFilePath = "~/dataFile.txt";
}
<!-- Displays a physical path C:\Websites\MyWebSite\datafile.txt  -->
<p>@Server.MapPath(dataFilePath)</p>

Ссылка на виртуальный корень: оператор ~и метод Href

В ФАЙЛЕ CSHTML или VBHTML можно ссылаться на виртуальный корневой путь с помощью ~ оператора . Это очень удобно, потому что вы можете перемещать страницы на сайте, и любые ссылки, содержащиеся в них на другие страницы, не будут нарушены. Это также удобно в случае, если вы когда-нибудь переместите свой веб-сайт в другое место. Ниже приведено несколько примеров.

@{
    var myImagesFolder = "~/images";
    var myStyleSheet = "~/styles/StyleSheet.css";
}

Если используется http://myserver/myappвеб-сайт , вот как ASP.NET будет обрабатывать эти пути при запуске страницы:

  • myImagesFolder: http://myserver/myapp/images
  • myStyleSheet : http://myserver/myapp/styles/Stylesheet.css

(На самом деле эти пути не будут отображаться как значения переменной, но ASP.NET будет обрабатывать пути так, как если бы они были именно такими.)

Оператор можно использовать как в коде ~ сервера (как описано выше), так и в разметке следующим образом:

<!-- Examples of using the ~ operator in markup in ASP.NET Web Pages -->

<a href="~/Default">Home</a>
<img src="~/images/MyImages.png" />

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

Условная логика и циклы

ASP.NET серверный код позволяет выполнять задачи на основе условий и писать код, повторяющий инструкции определенное количество раз (т. е. код, запускающий цикл).

Условия тестирования

Чтобы проверить простое условие, используйте if оператор , который возвращает значение true или false на основе указанного теста:

@{
  var showToday = true;
  if(showToday)
  {
    @DateTime.Today;
  }
}

Ключевое слово if запускает блок. Фактический тест (условие) находится в скобках и возвращает значение true или false. Операторы, которые выполняются, если проверка имеет значение true, заключены в фигурные скобки. Инструкция if может включать блок, указывающий else операторы для выполнения, если условие имеет значение false:

@{
  var showToday = false;
  if(showToday)
  {
    @DateTime.Today;
  }
  else
  {
    <text>Sorry!</text>
  }
}

С помощью блока можно добавить несколько условий else if :

@{
    var theBalance = 4.99;
    if(theBalance == 0)
    {
        <p>You have a zero balance.</p>
    }
    else if (theBalance  > 0 && theBalance <= 5)
    {
        <p>Your balance of $@theBalance is very low.</p>
    }
    else
    {
        <p>Your balance is: $@theBalance</p>
    }
}

В этом примере, если первое условие в блоке if не равно true, else if проверяется условие. Если это условие выполняется, выполняются инструкции else if в блоке . Если ни одно из условий не выполняется, выполняются инструкции else в блоке. Можно добавить любое количество других блоков , а затем закрыть с else помощью блока в качестве условия "все остальное".

Чтобы протестировать большое количество условий, используйте switch блок :

@{
    var weekday = "Wednesday";
    var greeting = "";

    switch(weekday)
    {
        case "Monday":
            greeting = "Ok, it's a marvelous Monday";
            break;
        case "Tuesday":
            greeting = "It's a tremendous Tuesday";
            break;
        case "Wednesday":
            greeting = "Wild Wednesday is here!";
            break;
        default:
            greeting = "It's some other day, oh well.";
            break;
    }

    <p>Since it is @weekday, the message for today is: @greeting</p>
}

Проверяемое значение находится в круглых скобках (в примере переменная weekday ). Каждый отдельный case тест использует оператор, заканчивающийся двоеточием (:). Если значение инструкции case совпадает со значением теста, выполняется код в этом блоке. Каждый оператор case закрывается оператором break . (Если вы забыли включить разрыв в каждый case блок, код из следующей case инструкции также будет выполняться.) Блок switch часто имеет оператор в default качестве последнего случая для параметра "все остальное", который запускается, если ни один из других вариантов не соответствует действительности.

Результат последних двух условных блоков, отображаемых в браузере:

Razor-Img10

Циклическое выполнение кода

Часто требуется многократно выполнять одни и те же инструкции. Это можно сделать зацикливанием. Например, вы часто выполняете одни и те же инструкции для каждого элемента в коллекции данных. Если вы точно знаете, сколько раз вы хотите выполнить цикл, можно использовать for цикл. Этот тип цикла особенно полезен для подсчета вверх или обратного отсчета:

@for(var i = 10; i < 21; i++)
{
    <p>Line #: @i</p>
}

Цикл начинается с for ключевое слово, за которым следует три оператора в круглых скобках, каждый из которых заканчивается точкой с запятой.

  • В скобках первый оператор (var i=10;) создает счетчик и инициализирует его значением 10. Вам не нужно присваивать счетчику i имя — можно использовать любую переменную. При выполнении for цикла счетчик автоматически увеличивается.
  • Второй оператор (i < 21;) задает условие для подсчета. В этом случае требуется, чтобы значение не превышало 20 (т. е. продолжайте идти, пока счетчик меньше 21).
  • Третий оператор ( )i++ использует оператор приращения, который просто указывает, что счетчик должен добавлять к нему 1 при каждом запуске цикла.

Внутри фигурных скобок находится код, который будет выполняться для каждой итерации цикла. Разметка каждый раз создает новый абзац (<p> элемент) и добавляет строку в выходные данные, отображая значение i (счетчик). При запуске этой страницы в примере создается 11 строк, отображающих выходные данные, при этом текст в каждой строке указывает номер элемента.

Razor-Img11

При работе с коллекцией или массивом часто используется foreach цикл. Коллекция — это группа похожих объектов, и foreach цикл позволяет выполнять задачи для каждого элемента в коллекции. Этот тип цикла удобен для коллекций for , так как в отличие от цикла, вам не нужно увеличивать счетчик или устанавливать ограничение. Вместо этого foreach код цикла просто проходит через коллекцию, пока она не будет завершена.

Например, следующий код возвращает элементы в Request.ServerVariables коллекции, которая представляет собой объект, содержащий сведения о веб-сервере. Он использует foreac цикл h для отображения имени каждого элемента путем создания нового <li> элемента в маркированного списка HTML.

<ul>
@foreach (var myItem in Request.ServerVariables)
{
    <li>@myItem</li>
}
</ul>

За foreach ключевое слово следуют круглые скобки, в которых объявляется переменная, var itemпредставляющая один элемент в коллекции (в примере ), за которой следует in ключевое слово, а затем коллекция, которую вы хотите пройти. В теле foreach цикла можно получить доступ к текущему элементу с помощью переменной, объявленной ранее.

Razor-Img12

Чтобы создать цикл общего назначения, используйте инструкцию while :

@{
    var countNum = 0;
    while (countNum < 50)
    {
        countNum += 1;
        <p>Line #@countNum: </p>
    }
}

Цикл while начинается с while ключевое слово, за которым следует круглые скобки, в которых указывается, как долго цикл продолжается (здесь до тех пор, пока countNum меньше 50), а затем блок для повтора. Циклы обычно увеличивают (добавляют) или уменьшают (вычитают из) переменную или объект, используемые для подсчета. В примере += оператор добавляет 1 к каждому countNum выполнению цикла. (Для уменьшения переменной в цикле, который отсчитывается вниз, следует использовать оператор -=декремента .

Объекты и коллекции

Почти все на веб-сайте ASP.NET является объектом, включая саму веб-страницу. В этом разделе рассматриваются некоторые важные объекты, с которыми вы будете часто работать в коде.

Объекты страниц

Самым простым объектом в ASP.NET является страница. Доступ к свойствам объекта страницы можно получить напрямую без какого-либо соответствующего объекта. Следующий код получает путь к файлу страницы с помощью Request объекта страницы:

@{
    var path = Request.FilePath;
}

Чтобы понять, что вы ссылаетесь на свойства и методы в текущем объекте страницы, при необходимости можно использовать ключевое слово this для представления объекта страницы в коде. Ниже приведен предыдущий пример кода с this добавлением для представления страницы:

@{
    var path = this.Request.FilePath;
}

Свойства объекта можно использовать для Page получения большого объема информации, например:

  • Request. Как вы уже видели, это набор сведений о текущем запросе, включая тип браузера, выполненный запрос, URL-адрес страницы, удостоверение пользователя и т. д.

  • Response. Это коллекция сведений об ответе (странице), которая будет отправлена в браузер после завершения выполнения кода сервера. Например, это свойство можно использовать для записи сведений в ответ.

    @{
        // Access the page's Request object to retrieve the Url.
        var pageUrl = this.Request.Url;
    }
    <a href="@pageUrl">My page</a>
    

Объекты коллекции (массивы и словари)

Коллекция — это группа объектов одного типа, например коллекция Customer объектов из базы данных. ASP.NET содержит множество встроенных коллекций, таких Request.Files как коллекция .

Вы часто работаете с данными в коллекциях. Двумя распространенными типами коллекций являются массив и словарь. Массив полезен, если вы хотите сохранить коллекцию похожих элементов, но не хотите создавать отдельную переменную для хранения каждого элемента:

@* Array block 1: Declaring a new array using braces. *@
@{
    <h3>Team Members</h3>
    string[] teamMembers = {"Matt", "Joanne", "Robert", "Nancy"};
    foreach (var person in teamMembers)
    {
        <p>@person</p>
    }
}

При использовании массивов объявляется определенный тип данных, например string, intили DateTime. Чтобы указать, что переменная может содержать массив, необходимо добавить в объявление квадратные скобки (например, string[] или int[]). Доступ к элементам в массиве можно получить по их позиции (индексу) или с помощью инструкции foreach . Индексы массива отсчитываются от нуля, то есть первый элемент находится в позиции 0, второй — в позиции 1 и т. д.

@{
    string[] teamMembers = {"Matt", "Joanne", "Robert", "Nancy"};
    <p>The number of names in the teamMembers array: @teamMembers.Length </p>
    <p>Robert is now in position: @Array.IndexOf(teamMembers, "Robert")</p>
    <p>The array item at position 2 (zero-based) is @teamMembers[2]</p>
    <h3>Current order of team members in the list</h3>
    foreach (var name in teamMembers)
    {
        <p>@name</p>
    }
    <h3>Reversed order of team members in the list</h3>
    Array.Reverse(teamMembers);
    foreach (var reversedItem in teamMembers)
    {
        <p>@reversedItem</p>
    }
}

Количество элементов в массиве можно определить, получив его Length свойство. Чтобы получить позицию определенного элемента в массиве (для поиска в массиве Array.IndexOf ), используйте метод . Вы также можете выполнять такие действия, как обратная отмена содержимого массива Array.Reverse (метод) или сортировка содержимого ( Array.Sort метод ).

Выходные данные кода массива строк, отображаемого в браузере:

Razor-Img13

Словарь — это коллекция пар "ключ-значение", в которой указывается ключ (или имя), чтобы задать или извлечь соответствующее значение:

@{
    var myScores = new Dictionary<string, int>();
    myScores.Add("test1", 71);
    myScores.Add("test2", 82);
    myScores.Add("test3", 100);
    myScores.Add("test4", 59);
}
<p>My score on test 3 is: @myScores["test3"]%</p>
@{myScores["test4"] = 79;}
<p>My corrected score on test 4 is: @myScores["test4"]%</p>

Чтобы создать словарь, используйте new ключевое слово, чтобы указать, что вы создаете новый объект словаря. Вы можете назначить словарь переменной с помощью var ключевое слово. Укажите типы данных элементов в словаре с помощью угловых скобок ( < > ). В конце объявления необходимо добавить пару круглых скобок, так как фактически это метод, который создает новый словарь.

Чтобы добавить элементы в словарь, можно вызвать Add метод переменной словаря (myScores в данном случае), а затем указать ключ и значение. Кроме того, можно использовать квадратные скобки, чтобы указать ключ и выполнить простое назначение, как показано в следующем примере:

myScores["test4"] = 79;

Чтобы получить значение из словаря, укажите ключ в квадратных скобках:

var testScoreThree = myScores["test3"];

Вызов методов с параметрами

Как вы читали ранее в этой статье, программируемые объекты могут иметь методы. Например, Database объект может иметь Database.Connect метод . Многие методы также имеют один или несколько параметров. Параметр — это значение, передаваемое методу, чтобы разрешить методу завершить свою задачу. Например, посмотрите на объявление для Request.MapPath метода , который принимает три параметра:

public string MapPath(string virtualPath, string baseVirtualDir, 
    bool allowCrossAppMapping);

(Строка была заключена в оболочку, чтобы сделать ее более удобочитаемой. Помните, что разрывы строк можно размещать практически в любом месте, за исключением строк, заключенных в кавычки.)

Этот метод возвращает физический путь на сервере, соответствующий указанному виртуальному пути. Три параметра метода: virtualPath, baseVirtualDirи allowCrossAppMapping. (Обратите внимание, что в объявлении параметры перечислены с типами данных, которые они будут принимать.) При вызове этого метода необходимо указать значения для всех трех параметров.

Синтаксис Razor предоставляет два варианта передачи параметров в метод: позиционные параметры и именованные параметры. Чтобы вызвать метод с помощью позиционных параметров, передайте параметры в строгом порядке, указанном в объявлении метода. (Как правило, этот порядок можно узнать, ознакомившись с документацией по методу.) Необходимо следовать порядку, и вы не можете пропустить ни один из параметров— при необходимости вы передаете пустую строку ("") или null для позиционного параметра, для которых у вас нет значения.

В следующем примере предполагается, что на веб-сайте есть папка с именем scripts . Код вызывает Request.MapPath метод и передает значения для трех параметров в правильном порядке. Затем отображается полученный сопоставленный путь.

@{
    // Pass parameters to a method using positional parameters.
    var myPathPositional = Request.MapPath("/scripts", "/", true);
}
<p>@myPathPositional</p>

Если метод имеет много параметров, вы можете сделать код более удобочитаемым с помощью именованных параметров. Чтобы вызвать метод с помощью именованных параметров, укажите имя параметра, за которым следует двоеточие (:), а затем значение . Преимущество именованных параметров заключается в том, что их можно передать в любом порядке. (Недостаток заключается в том, что вызов метода не является компактным.)

В следующем примере вызывается тот же метод, что и выше, но для предоставления значений используются именованные параметры:

@{
    // Pass parameters to a method using named parameters.
    var myPathNamed = Request.MapPath(baseVirtualDir: "/", 
        allowCrossAppMapping: true, virtualPath: "/scripts");
}
<p>@myPathNamed</p>

Как видите, параметры передаются в другом порядке. Однако при выполнении предыдущего и этого примера они будут возвращать то же значение.

Обработка ошибок

Операторы Try-Catch

В коде часто есть операторы, которые могут завершиться сбоем по причинам, не входящим в ваш контроль. Пример:

  • Если код пытается создать файл или получить к ней доступ, могут возникнуть ошибки всех типов. Нужный файл может не существовать, он может быть заблокирован, код может не иметь разрешений и т. д.
  • Аналогичным образом, если код пытается обновить записи в базе данных, могут возникнуть проблемы с разрешениями, подключение к базе данных может быть удалено, данные для сохранения могут быть недопустимыми и т. д.

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

Razor-Img14

В ситуациях, когда в коде могут возникать исключения, и во избежание сообщений об ошибках этого типа можно использовать try/catch операторы . В инструкции try выполняется код, который вы проверяете. В одной или нескольких catch инструкциях можно найти определенные ошибки (определенные типы исключений), которые могли возникнуть. Вы можете включить столько catch операторов, сколько нужно для поиска ожидаемых ошибок.

Примечание

Рекомендуется избегать использования Response.Redirect метода в try/catch инструкциях , так как это может вызвать исключение на странице.

В следующем примере показана страница, которая создает текстовый файл при первом запросе, а затем отображает кнопку, позволяющую пользователю открыть файл. В примере намеренно используется неправильное имя файла, чтобы вызвать исключение. Код включает catch инструкции для двух возможных исключений: FileNotFoundException, которое возникает, если имя файла неправильное, и DirectoryNotFoundException, которое происходит, если ASP.NET даже не удается найти папку. (Вы можете раскомментировать оператор в примере, чтобы увидеть, как он выполняется, когда все работает правильно.)

Если код не обработал исключение, вы увидите страницу ошибки, как на предыдущем снимке экрана. Однако этот try/catch раздел помогает предотвратить появление таких ошибок.

@{
    var dataFilePath = "~/dataFile.txt";
    var fileContents = "";
    var physicalPath = Server.MapPath(dataFilePath);
    var userMessage = "Hello world, the time is " + DateTime.Now;
    var userErrMsg = "";
    var errMsg = "";

    if(IsPost)
    {
        // When the user clicks the "Open File" button and posts
        // the page, try to open the created file for reading.
        try {
            // This code fails because of faulty path to the file.
            fileContents = File.ReadAllText(@"c:\batafile.txt");

            // This code works. To eliminate error on page,
            // comment the above line of code and uncomment this one.
            //fileContents = File.ReadAllText(physicalPath);
        }
        catch (FileNotFoundException ex) {
            // You can use the exception object for debugging, logging, etc.
            errMsg = ex.Message;
            // Create a friendly error message for users.
            userErrMsg = "A file could not be opened, please contact "
                + "your system administrator.";
        }
        catch (DirectoryNotFoundException ex) {
            // Similar to previous exception.
            errMsg = ex.Message;
            userErrMsg = "A directory was not found, please contact "
                + "your system administrator.";
        }
    }
    else
    {
        // The first time the page is requested, create the text file.
        File.WriteAllText(physicalPath, userMessage);
    }
}

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Try-Catch Statements</title>
    </head>
    <body>
    <form method="POST" action="" >
      <input type="Submit" name="Submit" value="Open File"/>
    </form>

    <p>@fileContents</p>
    <p>@userErrMsg</p>

    </body>
</html>

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

Программирование с помощью Visual Basic

Приложение. Язык и синтаксис Visual Basic

Справочная документация

ASP.NET

Язык C#