Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье представлен обзор программирования с помощью веб-страниц ASP.NET с помощью синтаксиса Razor и Visual Basic. ASP.NET — это технология Майкрософт для запуска динамических веб-страниц на веб-серверах.
Что вы узнаете:
- Первые 8 советов по программированию для начала работы с программированием ASP.NET веб-страниц с помощью синтаксиса Razor.
- Основные понятия программирования, которые вам потребуются.
- Суть кода сервера ASP.NET и синтаксиса Razor.
Версии программного обеспечения
- веб-страницы ASP.NET (Razor) 3
Это руководство также подходит для ASP.NET Web Pages второй версии.
Большинство примеров использования 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. Шаблоны веб-сайтов устанавливаются в корневую папку сайта в папке с именем Microsoft Templates.
Лучшие 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-формами" на сайтах веб-страниц 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 свойство. Объекты также имеют методы, которые являются "действиями", которые они могут выполнять. К примерам относятся метод объекта файла, метод объекта SaveRotate изображения и метод объекта 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оценивается как истинный, условный код выполняется и отображает результат сложения чисел.
- Символ
Сохраните страницу и запустите ее в браузере. (Перед запуском страницы выберите страницу в рабочей области "Файлы ".) Введите два целых числа и нажмите кнопку "Добавить ".
Язык и синтаксис 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) и переменные даты, которые хранят значения дат в различных форматах (например, 4.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
Логические операторы И и ИЛИ, которые служат для связывания условий вместе.
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. Инструкции, которые выполняются, если тест истинный, заключены между If и End If. Оператор If может включать блок Else, указывающий команды для выполнения, если условие ложное:
@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>
Значение для тестирования находится в скобках (в примере переменная недели). Каждый отдельный тест использует инструкцию 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и baseVirtualDirallowCrossAppMapping. (Обратите внимание, что в объявлении параметры перечислены с типами данных, которые они будут принимать.) При вызове этого метода необходимо указать значения для всех трех параметров.
При использовании Visual Basic с синтаксисом Razor есть два варианта передачи параметров методу: позиционные параметры или именованные параметры. Чтобы вызвать метод с помощью позиционных параметров, передайте параметры в строгом порядке, указанном в объявлении метода. (Как правило, этот порядок можно узнать, прочитав документацию по методу.) Вы должны следовать порядку, и вы не можете пропустить какие-либо параметры, если это необходимо, вы передаете пустую строку ("") или null для позиционного параметра, для которых нет значения.
В следующем примере предполагается, что на веб-сайте есть папка с именованными скриптами . Код вызывает 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>