Введение в веб-программирование на 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>
Результат, отображаемый в браузере:
Совет
Кодирование 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>
Результат, отображаемый в браузере:
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>
Результат, отображаемый в браузере:
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>
Результат, отображаемый в браузере:
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>
Результат, отображаемый в браузере:
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>
Результат, отображаемый в браузере:
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
операторами существует множество способов проверки условий, повторения блоков кода и т. д., которые описаны далее в этой статье.
Результат, отображаемый в браузере (после нажатия кнопки Отправить):
Совет
Методы HTTP GET и POST и свойство IsPost
Протокол, используемый для веб-страниц (HTTP), поддерживает очень ограниченное количество методов (глаголов), которые используются для выполнения запросов к серверу. Двумя наиболее распространенными из них являются GET, которая используется для чтения страницы, и POST, которая используется для отправки страницы. Как правило, при первом запросе пользователем страницы она запрашивается с помощью GET. Если пользователь заполняет форму и нажимает кнопку Отправить, браузер отправляет серверу запрос POST.
При веб-программировании часто бывает полезно узнать, запрашивается ли страница как GET или POST, чтобы вы знали, как обрабатывать страницу. В веб-страницы ASP.NET можно использовать IsPost
свойство , чтобы узнать, является ли запрос get или POST. Если запрос является post, IsPost
свойство возвращает значение true, и вы можете выполнять такие действия, как чтение значений текстовых полей в форме. Во многих примерах показано, как обрабатывать страницу по-разному в зависимости от значения IsPost
.
Простой пример кода
В этой процедуре показано, как создать страницу, демонстрирующую основные методы программирования. В примере создается страница, которая позволяет пользователям ввести два числа, а затем добавить их и отобразить результат.
В редакторе создайте новый файл и назовите его AddNumbers.vbhtml.
Скопируйте приведенный ниже код и разметку на страницу, заменив все, что уже есть на странице.
@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, и условный код выполняется, отображая результат сложения чисел.
- Символ
Сохраните страницу и запустите ее в браузере. (Перед запуском убедитесь, что страница выбрана в рабочей области Файлы .) Введите два целых числа и нажмите кнопку Добавить .
Язык и синтаксис 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>
Результат, отображаемый в браузере:
Преобразование и тестирование типов данных
Хотя 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
блоке.
Результат последних двух условных блоков, отображаемых в браузере:
Циклическое выполнение кода
Часто требуется многократно выполнять одни и те же инструкции. Для этого нужно выполнить цикл. Например, вы часто выполняете одни и те же инструкции для каждого элемента в коллекции данных. Если вы точно знаете, сколько раз вы хотите выполнить цикл, можно использовать 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 строк, отображающих выходные данные, с текстом в каждой строке, указывающим номер элемента.
При работе с коллекцией или массивом часто используется 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
цикла можно получить доступ к текущему элементу с помощью переменной, объявленной ранее.
Чтобы создать цикл общего назначения, используйте 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
метод ).
Выходные данные кода массива строк, отображаемого в браузере:
Словарь — это коллекция пар "ключ-значение", в которой указывается ключ (или имя), чтобы задать или извлечь соответствующее значение:
@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
В коде часто есть операторы, которые могут завершиться сбоем по причинам, не входящим в ваш контроль. Пример:
- Если код пытается открыть, создать, прочитать или записать файл, могут возникнуть ошибки всех типов. Нужный файл может не существовать, он может быть заблокирован, код может не иметь разрешений и т. д.
- Аналогичным образом, если код пытается обновить записи в базе данных, могут возникнуть проблемы с разрешениями, подключение к базе данных может быть удалено, данные для сохранения могут быть недопустимыми и т. д.
С точки зрения программирования эти ситуации называются исключениями. Если код встречает исключение, он создает (выдает) сообщение об ошибке, которое в лучшем случае раздражает пользователей.
В ситуациях, когда в коде могут возникать исключения, и во избежание сообщений об ошибках этого типа можно использовать 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>