Введение в веб-программирование на ASP.NET с помощью синтаксиса Razor (Visual Basic)

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

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

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

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

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

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

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

В большинстве примеров использования веб-страницы ASP.NET с синтаксисом Razor используется C#. Но синтаксис Razor также поддерживает Visual Basic. Чтобы запрограммировать веб-страницу ASP.NET в Visual Basic, создайте веб-страницу с расширением имени файла .vbhtml , а затем добавьте код Visual Basic. В этой статье представлен обзор работы с языком и синтаксисом Visual Basic для создания ASP.NET веб-страниц.

Примечание

Шаблоны веб-сайтов по умолчанию для Microsoft WebMatrix (пекарня, фотоальбом, начальный сайт и т. д.) доступны в версиях C# и Visual Basic. Шаблоны Visual Basic можно установить в виде пакетов NuGet. Шаблоны веб-сайтов устанавливаются в корневую папку сайта в папке с именем Шаблоны Майкрософт.

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

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

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

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

<!-- Single statement blocks  -->
@Code  Dim total = 7  End Code
@Code  Dim myMessage = "Hello World" End Code

<!-- Inline expressions -->
<p>The value of your account is: @total </p>
<p>The value of myMessage is: @myMessage</p>        
    
<!-- Multi-statement block -->    
@Code 
    Dim greeting = "Welcome to our site!"
    Dim weekDay = DateTime.Now.DayOfWeek
    Dim greetingMessage = greeting & " Today is: " & weekDay.ToString()
End Code 
<p>The greeting is: @greetingMessage</p>

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

Razor-Img1

Совет

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

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

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

Дополнительные сведения о кодировании HTML см. в статье Работа с HTML Forms на сайтах веб-страницы ASP.NET.

2. Блоки кода заключаются в код... Код завершения

Блок кода включает один или несколько операторов кода и заключен в ключевые слова Code и End Code. Поместите открывающий Code ключевое слово сразу после символа @ — между ними не может быть пробелов.

<!-- Single statement block.  -->
@Code
    Dim theMonth = DateTime.Now.Month
End Code
<p>The numeric value of the current month: @theMonth</p>

<!-- Multi-statement block. -->
@Code
    Dim outsideTemp = 79
    Dim weatherMessage = "Hello, it is " & outsideTemp & " degrees."
End Code 
<p>Today's weather: @weatherMessage</p>

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

Razor-Img2

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

В блоке кода Visual Basic каждый оператор заканчивается разрывом строки. (Далее в этой статье вы узнаете, как при необходимости упаковать длинный оператор кода в несколько строк.)

<!-- Single statement block. -->
@Code
    Dim theMonth = DateTime.Now.Month
End Code

<!-- Multi-statement block. -->
@Code
    Dim outsideTemp = 79
    Dim weatherMessage = "Hello, it is " & outsideTemp & " degrees."
End Code 

<!-- An inline expression, so no line break needed. -->
<p>Today's weather: @weatherMessage</p>

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

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

<!-- Storing a string -->
@Code 
    Dim welcomeMessage = "Welcome, new members!"
End Code
<p>@welcomeMessage</p>
    
<!-- Storing a date -->
@Code 
    Dim year = DateTime.Now.Year
End Code

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

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

Razor-Img3

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

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

@Code 
    Dim myString = "This is a string literal"
End Code

Чтобы внедрить двойные кавычки в строковое значение, вставьте две двойные кавычки. Если вы хотите, чтобы символ двойной кавычки отображался в выходных данных страницы один раз, введите его как "" в строке в кавычках, а если вы хотите, чтобы он отображался дважды, введите его как """" внутри строки с кавычками.

<!-- Embedding double quotation marks in a string -->
@Code 
    Dim myQuote = "The person said: ""Hello, today is Monday."""
End Code
<p>@myQuote</p>

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

Razor-Img4

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

В языке Visual Basic регистр не учитывается. Ключевые слова программирования (например Dim, , Ifи True) и имена переменных (например myString, или subTotal) могут быть написаны в любом случае.

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

@Code 
    Dim lastName = "Smith"
    ' Keywords like dim are also not case sensitive.
    DIM someNumber = 7
End Code
<p>The value of the <code>lastName</code> variable is: @LASTNAME</p>

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

vb-syntax-5

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 оператора).

@Code
   Dim result = ""
   If IsPost Then
      result = "This page was posted using the Submit button."
   Else
      result = "This was the first request for this page."
   End If
End Code
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Write Code that Makes Decisions</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.vbhtml.

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

    @Code
        Dim total = 0
        Dim totalMessage = ""
        if IsPost Then
            ' Retrieve the numbers that the user entered.
            Dim num1 = Request("text1")
            Dim num2 = Request("text2")
            ' Convert the entered strings into integers numbers and add.
            total = num1.AsInt() + num2.AsInt()
            totalMessage = "Total = " & total
        End If
    End Code
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8" />
            <title>Adding Numbers</title>
            <style type="text/css">
                body {background-color: beige; font-family: Verdana, Ariel; 
                    margin: 50px;
                    }
                form {padding: 10px; border-style: solid; width: 250px;}
            </style>
        </head>
    <body>
        <p>Enter two whole numbers and click <strong>Add</strong> to display the result.</p>
        <p></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 , внедренной внизу.
    • Блок в верхней части страницы заключен в Code...End Code.
    • Переменные total, num1, num2и totalMessage хранят несколько чисел и строку.
    • Строковое литеральное значение, назначенное переменной totalMessage , находится в двойных кавычках.
    • Так как в коде Visual Basic регистр не учитывается, при totalMessage использовании переменной в нижней части страницы ее имя должно соответствовать только написанию объявления переменной в верхней части страницы. Корпус не имеет значения.
    • Выражение num1.AsInt() + num2.AsInt() показывает, как работать с объектами и методами. Метод AsInt для каждой переменной преобразует строку, введенную пользователем, в целое число, которое можно добавить.
    • Тег <form> содержит method="post" атрибут . Это указывает, что при нажатии пользователем кнопки Добавить страница будет отправлена на сервер с помощью метода HTTP POST. При отправке страницы код If IsPost оценивается как true, и условный код выполняется, отображая результат сложения чисел.
  3. Сохраните страницу и запустите ее в браузере. (Перед запуском убедитесь, что страница выбрана в рабочей области Файлы .) Введите два целых числа и нажмите кнопку Добавить .

    Razor-Img7

Язык и синтаксис Visual Basic

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

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

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

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

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

    @If IsPost Then
        ' 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: </p> @DateTime.Now
    End If
    

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

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

    @If IsPost Then
        ' Plain text followed by an unmatched HTML tag and server code.
        @:The time is: <br /> @DateTime.Now
        ' Server code and then plain text, matched tags, and more text.
        @DateTime.Now @:is the <em>current</em> time.
    End If
    

    Следующий пример повторяет предыдущий пример, но использует одну пару тегов <text> для заключения текста для отрисовки.

    @If IsPost Then
        @<text>
        The time is: <br /> @DateTime.Now
        @DateTime.Now is the <em>current</em> time.
        </text>
    End If
    

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

    @Code
        dim minTemp = 75 
        @<text>It is the month of @DateTime.Now.ToString("MMMM"), and  
        it's a <em>great</em> day! <p>You can go swimming if it's at 
        least @minTemp degrees.</p></text>
    End Code
    

    Примечание

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

Пробелы

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

@Code Dim personName =    "Smith"    End Code

Разбиение длинных инструкций на несколько строк

Длинный оператор кода можно разбить на несколько строк с помощью символа _ подчеркивания (который в Visual Basic называется символом продолжения) после каждой строки кода. Чтобы разбить оператор на следующую строку, в конце строки добавьте пробел, а затем символ продолжения. Продолжите инструкцию в следующей строке. Операторы можно перенести в любое количество строк, чтобы повысить удобочитаемость. Следующие инструкции равнозначны:

@Code
    Dim familyName _
    =  "Smith" 
End Code

@Code
    Dim _
    theName _
    = _
    "Smith"
End Code

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

@Code 
    ' Doesn't work.
    Dim test = "This is a long _
      string"
End Code

Чтобы объединить длинную строку, которая заключает в несколько строк, как в приведенном выше коде, необходимо использовать оператор объединения (&), который вы увидите далее в этой статье.

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

Комментарии позволяют оставить заметки для себя или других пользователей. Комментарии к синтаксису Razor имеют префикс @* и заканчиваются на *@.

@* A single-line comment is added like this example. *@
    
@*
    This is a multiline code comment. 
    It can continue for any number of lines.
*@

В блоках кода можно использовать комментарии синтаксиса Razor или обычный символ комментария Visual Basic, который представляет собой одну кавычку (') с префиксом к каждой строке.

@Code
    ' You can make comments in blocks by just using ' before each line.
End Code
    
@Code
    ' There is no multi-line comment character in Visual Basic. 
    ' You use a ' before each line you want to comment. 
End Code

Переменные

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

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

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

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

Чтобы объявить переменную без указания типа, используйте Dim плюс имя переменной (например, Dim myVar). Чтобы объявить переменную с типом, используйте Dim плюс имя переменной, а затем As имя типа (например, Dim myVar As String).

@Code
    ' Assigning a string to a variable.
    Dim greeting = "Welcome" 
    
    ' Assigning a number to a variable.
    Dim theCount = 3
    
    ' Assigning an expression to a variable.
    Dim monthlyTotal = theCount + 5
    
    ' Assigning a date value to a variable.
    Dim today = DateTime.Today
    
    ' Assigning the current page's URL to a variable.
    Dim myPath = Request.Url
    
    ' Declaring variables using explicit data types.
    Dim name as String = "Joe"
    Dim count as Integer = 5
    Dim tomorrow as DateTime = DateTime.Now.AddDays(1)
End Code

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

@Code
    ' Embedding the value of a variable into HTML markup.
    ' Precede the markup with @ because we are in a code block.
    @<p>@greeting, friends!</p>
End Code

<!-- Using a variable with an inline expression in HTML. --> 
<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, выполнив явное преобразование. Даже если вам не нужно преобразовывать типы, иногда полезно проверить, с каким типом данных вы можете работать.

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

@Code
    Dim total = 0
    Dim totalMessage = ""
    if IsPost Then
        ' Retrieve the numbers that the user entered.
        Dim num1 = Request("text1")
        Dim num2 = Request("text2")
        ' Convert the entered strings into integers numbers and add.
        total = num1.AsInt() + num2.AsInt()
        totalMessage = "Total = " & total
    End If
End Code

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

Cannot implicitly convert type 'string' to 'int'.

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

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

Метод

Описание

Пример


AsInt(), IsInt()

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

Dim myIntNumber = 0
Dim myStringNum = "539"
If myStringNum.IsInt() Then
    myIntNumber = myStringNum.AsInt()
End If

AsBool(), IsBool()

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

Dim myStringBool = "True"
Dim myVar = myStringBool.AsBool()

AsFloat(), IsFloat()

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

Dim myStringFloat = "41.432895"
Dim myFloatNum = myStringFloat.AsFloat()

AsDecimal(), IsDecimal()

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

Dim myStringDec = "10317.425"
Dim myDecNum = myStringDec.AsDecimal()

AsDateTime(), IsDateTime()

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

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

ToString()

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

Dim num1 As Integer = 17
Dim num2 As Integer = 76

' myString is set to 1776
Dim myString as String = num1.ToString() & _
    num2.ToString()

Операторы

Оператор — это ключевое слово или символ, который сообщает ASP.NET, какую команду следует выполнить в выражении. Visual Basic поддерживает множество операторов, но для начала разработки ASP.NET веб-страниц необходимо лишь распознать некоторые из них. В следующей таблице перечислены наиболее распространенные операторы.

Оператор

Описание

Примеры


+ - * /

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

@(5 + 13)

Dim netWorth = 150000
Dim newTotal = netWorth * 2
@(newTotal / 2)

=

Назначение и равенство. В зависимости от контекста либо присваивает значение в правой части оператора объекту слева, либо проверяет значения на равенство.

Dim age = 17

Dim income = Request("AnnualIncome")

<>

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

Dim theNum = 13
If theNum <> 15 Then
    ' Do something.
End If

< > <= >=

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

If 2 < 3 Then
    ' Do something.
End If

Dim currentCount = 12
If currentCount >= 12 Then
    ' Do something.
End If

&

Объединение, которое используется для соединения строк.

' The displayed result is "abcdef".
@("abc" & "def")

+= -=

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

Dim theCount As Integer = 0
theCount += 1 ' Adds 1 to count

.

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

Dim myUrl = Request.Url
Dim count = Request("Count").AsInt()

()

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

@(3 + 7)

@Request.MapPath(Request.FilePath)

Not

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

Dim taskCompleted As Boolean = False
' Processing.
If Not taskCompleted Then 
    ' Continue processing
End If

AndAlso OrElse

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

Dim myTaskCompleted As Boolean = false
Dim totalCount As Integer = 0          
' Processing.
If (Not myTaskCompleted) AndAlso _
         totalCount < 12 Then 
    ' Continue processing.
End If

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

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

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). Этот метод используется каждый раз, когда вам нужен полный физический путь. Типичный пример — чтение или запись текстового файла или файла изображений на веб-сервере.

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

@Code
    Dim dataFilePath = "~/dataFile.txt"
End Code    

<!-- Displays a physical path C:\Websites\MyWebSite\datafile.txt  --> 
<p>@Server.MapPath(dataFilePath)</p>

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

В файле .cshtml или .vbhtml можно ссылаться на виртуальный корневой путь с помощью ~ оператора . Это очень удобно, так как вы можете перемещать страницы на сайте, и любые ссылки, содержащиеся в них на другие страницы, не будут нарушены. Это также удобно в случае, если вы когда-либо переместите свой веб-сайт в другое место. Ниже приведено несколько примеров.

@Code
    Dim myImagesFolder = "~/images"
    Dim myStyleSheet = "~/styles/StyleSheet.css"       
End Code

Если веб-сайт имеет значение 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...Then оператор , который возвращает True или False на основе указанного теста:

@Code
    Dim showToday = True
    If showToday Then
        DateTime.Today
    End If
End Code

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

@Code
    Dim showToday = False
    If showToday Then
        DateTime.Today
    Else
        @<text>Sorry!</text>
    End If
End Code

Если инструкция If запускает блок кода, вам не нужно использовать обычные Code...End Code операторы для включения блоков. Вы можете просто добавить @ в блок, и он будет работать. Этот подход работает с If и другими ключевыми словами программирования Visual Basic, за которыми следуют блоки кода, включая For, For Each, Do Whileи т. д.

@If showToday Then
    DateTime.Today
Else
    @<text>Sorry!</text>
End If

Можно добавить несколько условий с помощью одного или нескольких ElseIf блоков:

@Code
    Dim theBalance = 4.99
    If theBalance = 0 Then
        @<p>You have a zero balance.</p>
    ElseIf theBalance > 0 AndAlso theBalance <= 5 Then
        ' If the balance is above 0 but less than
        ' or equal to $5, display this message.
        @<p>Your balance of $@theBalance is very low.</p>
    Else
        ' For balances greater than $5, display balance.
        @<p>Your balance is: $@theBalance</p>
    End If    
End Code

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

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

@Code
    Dim weekday = "Wednesday"
    Dim greeting = ""
    
    Select Case weekday
        Case "Monday"
            greeting = "Ok, it's a marvelous Monday."
        Case "Tuesday"
            greeting = "It's a tremendous Tuesday."
        Case "Wednesday"
            greeting = "Wild Wednesday is here!"
        Case Else
            greeting = "It's some other day, oh well."
    End Select
End Code
<p>Since it is @weekday, the message for today is: @greeting</p>

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

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

Razor-Img10

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

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

@For i = 10 To 20
    @<p>Item #: @i</p>
Next i

Цикл начинается с For ключевое слово, за которым следуют три элемента:

  • Сразу после For оператора объявляется переменная счетчика (не нужно использовать Dim), а затем указывается диапазон, как в i = 10 to 20. Это означает, что переменная i начнет подсчитывать значение 10 и будет продолжаться до тех пор, пока не достигнет значения 20 (включительно).
  • For Между операторами и Next находится содержимое блока. Он может содержать один или несколько операторов кода, которые выполняются с каждым циклом.
  • Оператор Next i завершает цикл. Он увеличивает значение счетчика и начинает следующую итерацию цикла.

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

Razor-Img11

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

В этом примере возвращаются элементы в Request.ServerVariables коллекции (которая содержит сведения о веб-сервере). Он использует For Each цикл для отображения имени каждого элемента путем создания нового <li> элемента в маркированный список HTML.

<ul>
@For Each myItem In Request.ServerVariables
    @<li>@myItem</li>
Next myItem
</ul>

За For Each ключевое слово следует переменная, представляющая отдельный элемент в коллекции (в примере ), myItemза которым следует In ключевое слово, а затем коллекция, через которую требуется выполнить цикл. В тексте For Each цикла можно получить доступ к текущему элементу с помощью переменной, объявленной ранее.

Razor-Img12

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

@Code
    Dim countNum = 0
    Do While countNum < 50
        countNum += 1
        @<p>Line #@countNum: </p>
    Loop
End Code

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

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

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

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

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

@Code
    Dim path = Request.FilePath
End Code

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

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

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

    @Code
        ' Access the page's Request object to retrieve the URL.
        Dim pageUrl = Request.Url
    End Code
        <a href="@pageUrl">My page</a>
    

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

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

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

<h3>Team Members</h3>
@Code
    Dim teamMembers() As String = {"Matt", "Joanne", "Robert", "Nancy"}
    For Each name In teamMembers
        @<p>@name</p>
    Next name
End Code

При использовании массивов объявляется определенный тип данных, например String, Integerили DateTime. Чтобы указать, что переменная может содержать массив, добавьте круглые скобки к имени переменной в объявлении (например Dim myVar() As String, ). Доступ к элементам в массиве можно получить по их позиции (индексу) или с помощью инструкции For Each . Индексы массива отсчитываются от нуля, то есть первый элемент находится в позиции 0, второй — в позиции 1 и т. д.

@Code
    Dim teamMembers() As String = {"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>
    For Each name In teamMembers
        @<p>@name</p>
    Next name
    @<h3>Reversed order of team members in the list</h3>
    Array.Reverse(teamMembers)
    For Each reversedItem In teamMembers
        @<p>@reversedItem</p>
    Next reversedItem
End Code

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

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

Razor-Img13

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

@Code
    Dim myScores = New Dictionary(Of String, Integer)()
    myScores.Add("test1", 71)
    myScores.Add("test2", 82)
    myScores.Add("test3", 100)
    myScores.Add("test4", 59)
End Code
<p>My score on test 3 is: @myScores("test3")%</p>
@Code 
    myScores("test4") = 79
End Code
<p>My corrected score on test 4 is: @myScores("test4")%</p>

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

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

@Code
    myScores("test4") = 79
End Code

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

@myScores("test4")

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

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

Public Overridable Function MapPath (virtualPath As String, _
    baseVirtualDir As String, _
    allowCrossAppMapping As Boolean)

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

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

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

@Code
    ' Pass parameters to a method using positional parameters.
    Dim myPathPositional = Request.MapPath("/scripts", "/", true)
End Code
<p>@myPathPositional</p>

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

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

@Code
    ' Pass parameters to a method using named parameters.
    Dim myPathNamed = Request.MapPath(baseVirtualDir:= "/", allowCrossAppMapping:= true, virtualPath:= "/scripts")
End Code
<p>@myPathNamed</p>

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

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

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

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

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

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

Razor-Img14

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

Примечание

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

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

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

@Code
    Dim dataFilePath = "~/dataFile.txt"
    Dim fileContents = ""
    Dim physicalPath = Server.MapPath(dataFilePath)
    Dim userMessage = "Hello world, the time is " + DateTime.Now
    Dim userErrMsg = ""
    Dim errMsg = ""
    
    If IsPost Then
        ' When the user clicks the "Open File" button and posts
        ' the page, try to open the file.
        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 ex As FileNotFoundException
            ' You can use the exception object for debugging, logging, etc.
            errMsg = ex.Message
            ' Create a friendly error message for users.
            userErrMsg = "The file could not be opened, please contact " _
                & "your system administrator."
                
        Catch ex As DirectoryNotFoundException
            ' Similar to previous exception.
            errMsg = ex.Message
            userErrMsg = "The file could not be opened, please contact " _
                & "your system administrator."
        End Try
    Else
        ' The first time the page is requested, create the text file.
        File.WriteAllText(physicalPath, userMessage)
    End If
End Code
<!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>

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

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