Применение Visual Basic на веб-страницах ASP.NET

[Данная документация является предварительной и может быть изменена.]

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

Полученные знания:

  • восемь важнейших советов о программировании,
  • язык и синтаксис Visual Basic.

Восемь важнейших советов о программировании

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

1. При добавлении кода на страницу используется символ @

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

<!--Выражение встроенного кода-->

<p>The value of your account is: @total </p>

     

<!-- Блок из одной инструкции.  -->

@Code

    Dim myMessage= "Hello World"

EndCode

<p>The value of myMessage is: @myMessage</p>

<!--Блок из нескольких инструкций.  -->

@Code

    Dim greeting = "Welcome to our site!"

    Dim weekDay = DateTime.Now.DayOfWeek

    Dim greetingMessage = greeting & " Today is: " & weekDay.ToString()

EndCode

<p>The greeting is: @greetingMessage</p>

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

2. Блоки кода ограничиваются ключевыми словами "Code...End Code"

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

<!-- Блок из одной инструкции.  -->

@Code

    Dim theMonth=DateTime.Now.Month

EndCode

<p>The numeric value of the current month: @theMonth</p>

<!-- Блок из нескольких инструкций.  -->

@Code

    Dim outsideTemp= 79

    Dim weatherMessage = "Hello, it is "& outsideTemp & " degrees."

EndCode

<p>Today's weather: @weatherMessage</p>

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

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

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

<!-- Блок из одной инструкции. -->

@Code

    Dim theMonth=DateTime.Now.Month

EndCode

<!-- Блок из нескольких инструкций. -->

@Code

    Dim outsideTemp = 79

    Dim weatherMessage = "Hello, it is "& outsideTemp & " degrees."

EndCode

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

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

<!--Сохранение строки-->

@Code

    Dim welcomeMessage = "Welcome, new members!"

EndCode

<p>@welcomeMessage</p>

     

<!--Сохранение даты-->

@Code

    Dim year = DateTime.Now.Year

EndCode

<p>Welcome to our new members who joined in @year!</p>

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

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

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

@Code

    Dim myString = "This is a string literal"

EndCode

<p>The resulting variable value in the page:  @myString</p>

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

<!-- Вставка двойных кавычек в строку -->

@Code

    Dim myQuote = "The person said: ""Hello, today is Monday."""

EndCode

<p>A string with embedded double-quotes: @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

EndCode

<p>The value of the first variable is: @LASTNAME</p>

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

7. Значительную роль в создании кода играет работа с объектами

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

Часто приходится работать с объектом 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

EndCode

<!DOCTYPE html>

 <html>

    <head>

        <title></title>

    <head>

<body>

<form method="POST" action="">

  <input type="Submit" name="Submit" value="Submit" />

  <p>@result</p>

</form>

</body>

</html>   

    </body>

</html>

Инструкция If IsPost — это сокращенное написание строки If IsPost = True. Помимо инструкций с If, существует целый ряд способов проверки условий, повторения блоков кода и т.д., которые описываются далее в этой главе.

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

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

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

В веб-программировании часто полезно знать, каким методом — GET или POST — запрашивается страница, чтобы понять, как ее обрабатывать. Чтобы определить метод запроса (GET или POST), на веб-страницах ASP.NET можно воспользоваться свойством IsPost. Если запрос создан методом POST, свойство IsPost возвратит значение true, а пользователь сможет выполнять такие действия, как чтение значений в текстовых полях формы. Многие примеры в этом пособии показывают, как обрабатывать страницу различными способами в зависимости от значения свойства IsPost..

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

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

  1. Создайте в редакторе новый файл с именем AddNumbers.vbhtml.
  2. Скопируйте приведенные ниже код и разметку на страницу, заменив ими все, что на ней уже имеется. Код здесь выделен, чтобы было легче отличить его от разметки HTML.

    @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

    EndCode

    <!DOCTYPE html>

    <html>

        <head>

        <title></title>

        <meta http-equiv="content-type" content="text/html;charset=utf-8"/>

        <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". Он указывает, что когда пользователь нажмет кнопку Add (Сложить), страница будет отправлена на сервер методом HTTP POST. С отправкой страницы код If IsPost получает значение true, и запускается код условия, отображающий результат сложения чисел.
  3. Сохраните страницу и запустите ее в браузере. Введите два числа и нажмите кнопку Add (Сложить).

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

Глава 1. Начало работы с WebMatrix бета-версии и веб-страницами ASP.NET содержит простейший пример создания веб-страницы ASP.NET и добавления серверного кода в разметку HTML. Здесь будут разъяснены основы использования Visual Basic для написания серверного кода ASP.NET с применением синтаксиса (т.е. правил языка программирования) Razor.

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

Простой синтаксис

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

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

  • Добавление символа @ в отдельные строки, которые содержат разметку HTML и серверный код. Этот метод работает, если все содержимое в строке является кодом либо его разметка содержится внутри тегов HTML. Две выделенные строки демонстрируют пример объединения разметки HTML и кода, помеченного в начале символом @:

@IfIsPost Then

    @<p>Hello, the time is @DateTime.Now and this page is a postback!</p>

Else

    @<p>Hello, <em>Stranger!</em> today is: </p> @DateTime.Now

EndIf

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

@Code

    @:The day is: @DateTime.Now.DayOfWeek. It is a <em>great</em> day!

EndCode

Оператор @: достаточно использовать в строке один раз.

  • Использование оператора @ с тегами <text>для ограничения нескольких строк, содержащих простой текст. Эти строки могут содержать только простой текст или любое сочетание текста, разметки и кода. Тег <text>, подобно оператору @:, может использоваться в отдельной строке, но имеет дополнительную возможность ограничивать несколько строк простого текста либо сочетания текста, кода и разметки.

Примечание.   ASP.NET никогда не отображает теги <text>на выходной странице, возвращаемой в браузер. Эти теги используются только на сервере, чтобы позволить ASP.NET отличить текст от кода..

 

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

EndCode

 

HTML-кодировка

При добавлении символа @ в блоки кода ASP.NET выполняет HTML-кодировку выходных данных. При этом зарезервированные символы HTML (такие как < and > и &) заменяются кодами, которые обеспечивают правильное отображение символов на веб-странице. Без HTML-кодировки результат применения серверного кода может отображаться неправильно и сделать страницу уязвимой для угроз безопасности. Дополнительные сведения о HTML-кодировке см. в Глава 4. Работа с формами.

Пробелы

Лишние пробелы в инструкции (и вне строкового литерала) не влияют на инструкцию.

@Code DimpersonName =    "Smith"    EndCode

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

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

@Code

    Dim familyName _ 

    =  "Smith"

EndCode

@Code

    Dim _

    familyName _

    = _

    "Smith"

EndCode

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

@Code

    ' Дает сбой, поскольку так разбивать строку нельзя.

    Dim test = "This is a long _

    string"

EndCode

Для соединения длинной строки, разбитой на несколько строк, как показано выше, потребуется оператор сцепления (&), использование которого будет продемонстрировано далее в этой главе.

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

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

@' Комментарий длиной в одну строку добавляется, как в этом примере.

@Code

    ' Комментарии могут быть и в виде блоков с ' перед каждой строкой.

EndCode

     

@Code

    ' В Visual Basic нет символа для комментария из нескольких строк.

    ' Символ ' ставится перед каждой строкой комментария.

EndCode

Переменные

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

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

Переменная может относиться к определенному типу данных, указывающему, данные какого рода хранятся в этой переменной. Существуют строковые переменные, в которых хранятся строковые значения (например, "Hello world"), целочисленные переменные, в которых хранятся целочисленные значения (например, 3 или 79), и переменные дат, в которых хранятся значения дат в различных форматах (например, 4/12/2010 или March 2009). Предусмотрены и другие типы данных, которые можно использовать. Однако указывать тип для переменной не требуется. В большинстве случаев ASP.NET может распознать тип на основании того, как используются данные в переменной. (Иногда указывать тип все же приходится; в данном пособии можно увидеть примеры этого.)

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

@Code

    ' Назначение строки для переменной.

    Dim greeting = "Welcome"

     

    ' Назначение числа для переменной.

    Dim theCount = 3

     

    ' Назначение выражения для переменной.

    Dim monthlyTotal = theCount + 5

     

    ' Назначение значения даты для переменной.

    Dim today = DateTime.Today

     

    ' Назначение URL-адреса текущей страницы для переменной.

    Dim myPath = Request.Url

     

    ' Объявление переменных с явно указанными типами данных.

    Dim name as String= "Joe"

    Dim count as Integer= 5

    Dim tomorrow as DateTime = DateTime.Now.AddDays(1)

EndCode

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

@Code

    ' Встраивание значения переменной в разметку HTML.

    ' В блоке кода разметке предшествует символ @.

    @<p>@greeting, friends!</p>

End Code

<!-- Использование переменной с выражением встроенного кода в HTML. -->

<p>The predicted annual total is: @( monthlyTotal * 12)</p>

<!-- Отображение URL-адреса страницы с переменной. -->

<p>The URL to this page is:  @myPath</p>

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

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

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

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

@Code

    Dim total = 0

    Dim totalMessage = ""

    if IsPostThen

        ' Извлечение введенных пользователем чисел.

        Dim num1 = Request("text1")

        Dim num2 = Request("text2")

        ' Преобразование введенных строк в целые числа и их сложение.

        total = num1.AsInt() + num2.AsInt()

        totalMessage = "Total = "& total

    End If

EndCode

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

Неявное преобразование типа "string" в "int" невозможно.

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

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

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

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()
Преобразует строку, представляющую значение даты и времени, в тип DateTime ASP.NET.

Dim myDateString = "12/27/2010"

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, достаточно распознавать лишь некоторые их них. В представленную ниже таблицу сведены наиболее распространенные операторы.

Оператор Описание Примеры
. Точка. Служит для различения объектов и их свойств и методов. Dim myUrl = Request.Url
() Скобки. Служат для группирования выражений, передачи параметров методам и обращения к членам массивов и коллекций.

@(3 + 7)
' Вызов метода
Array.Reverse(teamMembers)

' Получение элемента массива
Dim name1 = teamMembers(0)

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

' Присвоение значения

Dim age = 17

' Проверка равенства

If subTotal = 12 Then

@<p>@subTotal</p>

End If

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

Dim taskCompleted As Boolean = False

' Обработка

If Not taskCompleted Then

' Продолжение обработки

End If

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

Dim newNum = 14

If newNum <> 15 Then

@<p>Sorry, not quite.</p>

End If

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

If 2 < 3 Then

@<p>Two is less than three.</p>

End If

Dim currentCount = 12

If currentCount >= 12 Then

@<p>At least twelve.</p>

End If

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

@(5 + 13)

@(200 / 25)

@Code

Dim worth = assets – liabilities

End Code

@Code

Dim newTotal = netWorth * 2

End Code

@(newTotal / 2)

& Сцепление, используемое для соединения строк.

' Отображаемый результат: "abcdef".

@("abc" & "def")

AndAlso

OrElse

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

Dim stillWorking As Boolean = false

Dim totalCount As Integer = 0

' Обработка

If (Not stillWorking) AndAlso _

totalCount < 12 Then

@<p>Still running!</p>

End If

+=

-=

Операторы инкремента и декремента, которые служат соответственно для прибавления 1 к переменной и вычитания 1 из переменной.

Dim finalCount As Integer = 0

finalCount += 1

' Прибавляет 1 к итогу

Пути к файлам и папкам в коде

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

C:\WebSites\MyWebSite

    default.cshtml 

    datafile.txt

    \images

        Logo.jpg

    \styles 

        Styles.css

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

Физический путь: C:\WebSites\MyWebSiteFolder\styles\StyleSheet.css

Виртуальный путь (начиная с пути к виртуальному корневому каталогу /): /styles/StyleSheet.css

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

Оператор ~. Обозначение виртуального корневого каталога

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

@Code

    Dim myImagesFolder = "~/images"

    Dim myStyleSheet = "~/styles/StyleSheet.css"

EndCode

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

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

@Code

    Dim dataFilePath = "~/dataFile.txt"

EndCode

<!--Отображение физического пути C:\Websites\MyWebSite\datafile.txt  -->

<p>@Server.MapPath(dataFilePath)</p>

Метод Href. Создание путей к ресурсам сайта

Метод Href объекта WebPage преобразует созданные в серверном коде пути (которые могут включать оператор ~) в пути, понятные браузеру. (Браузер не распознает оператор ~, поскольку этот оператор применяется исключительно в ASP.NET.) Метод Href служит для создания путей к таким ресурсам, как файлы изображений, другие веб-страницы и CSS-файлы. Например, можно применить этот метод в разметке HTML к атрибутам элементов <img>, элементов <link> и элементов <a>.

<!— Этот код создает путь "../images/Logo.jpg" в атрибуте src. -->

<img src="@Href(myImagesFolder)/Logo.jpg" />

<!--  Это дает тот же результат, что и использование пути с оператором ~ --> 

<img src="@Href("~/images")/Logo.jpg" />

<!--  Создается ссылка на файл CSS. --> 

<link rel="stylesheet" type="text/css" href="@Href(myStyleSheet)"/>

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

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

Проверка условий

Чтобы проверить простое условие, применяется инструкция If...Then, которая по результатам заданного теста возвращает значение True или False.

@Code

    Dim showToday = True

    If showToday Then

        DateTime.Today

    End If

EndCode

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

@Code

    Dim showToday = False

    If showToday Then

        DateTime.Today

    Else

        @<text>Sorry!</text>

    End If

EndCode

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

@IfshowToday Then

    DateTime.Today

Else

    @<text>Sorry!</text>

EndIf

' Один или нескольких блоков с ElseIf позволяют добавить несколько условий: 

@Code

    Dim theBalance = 4.99

    If theBalance = 0 Then

        @<p>You have a zero balance.</p>

    ElseIf theBalance > 0 AndAlsotheBalance <= 5 Then

        ' Если остаток больше 0 и меньше

        ' или равен 5 долларам, отобразится это сообщение.

        @<p>Your balance of $@theBalance is very low.</p>

    Else

        ' При остатке больше 5 долларов отобразится остаток.

        @<p>Your balance is: $@theBalance</p>

    End If

EndCode

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

Для проверки большого количества условий применяют блок Select Case:

@Code

    Dim weekday = "Wednesday"

    Dim greeting = ""

     

    Select Caseweekday

        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

EndCode

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

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

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

Циклический код

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

@Fori = 10 To20

    @<p style="font-size: @(i & "pt")">My font size is now: @i</p>

Nexti

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

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

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

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

Этот пример кода возвращает компоненты коллекции Request.ServerVariables, которая содержит сведения о веб-сервере. Цикл For Each используется для отображения имени каждого элемента посредством создания нового элемента <li> в маркированном списке HTML.

<ul>

@ForEachmyItem InRequest.ServerVariables

    @<li>@myItem</li>

NextmyItem

</ul>

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

Для создания более универсального цикла применяют оператор Do While.

@Code

    Dim countNum = 0

    Do WhilecountNum < 50

        countNum += 1

        @<p>Line #@countNum: </p>

    Loop

EndCode

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

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

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

Объекты Page

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

@Code

    Dim path = Request.FilePath

EndCode

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

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

@Code

    ' Обращение к объекту Request страницы для извлечения Url-адреса.

    Dim pageUrl = Request.Url

EndCode

    <a href="@pageUrl">My page</a>

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

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

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

<h3>Team Members</h3>

@Code

    Dim teamMembers() AsString= {"Matt", "Joanne", "Robert", "Nancy"}

    For Eachname InteamMembers

        @<p>@name</p>

    Next name

EndCode

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

@Code

    Dim teamMembers() AsString= {"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 Eachname InteamMembers

        @<p>@name</p>

    Next name

    @<h3>Reversed order of team members in the list</h3>

    Array.Reverse(teamMembers)

    For EachreversedItem InteamMembers

        @<p>@reversedItem</p>

    Next reversedItem

EndCode

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

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

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

@Code

    Dim myScores = NewDictionary(Of String, Integer)()

    myScores.Add("test1", 71)

    myScores.Add("test2", 82)

    myScores.Add("test3", 100)

    myScores.Add("test4", 59)

EndCode

<p>My score on test 3 is: @myScores("test3")%</p>

@Code

    myScores("test4") = 79

EndCode

<p>My corrected score on test 4 is: @myScores("test4")%</p>

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

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

@Code

    myScores("test4") = 79

EndCode

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

@myScores("test4")

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

Инструкции Try-Catch

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

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

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

Сообщение об ошибке, созданное исключением

Чтобы избежать появления подобных сообщений об ошибках, можно применить инструкции Try/Catch. В инструкции Try запускается проверяемый код. В одной или нескольких инструкциях Catch можно найти конкретные ошибки (конкретные типы исключений), которые, возможно, возникли. Для поиска ожидаемых ошибок в код можно включить столько инструкций 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

        ' Когда пользователь нажимает кнопку "Open File" (Открыть файл) и

        ' отправляет страницу, попытаться открыть файл.

        Try

            ' Этот код дает сбой из-за неверного пути к файлу.

            fileContents = File.ReadAllText("c:\batafile.txt")

             

            ' Этот код работает. Чтобы устранить ошибку на странице,

            ' закомментируйте строку кода выше и раскомментируйте эту.

            'fileContents = File.ReadAllText(physicalPath)

             

        Catch ex AsFileNotFoundException

            ' Объект исключения можно использовать для отладки, ведения
            ' журналов и т.д.

            errMsg = ex.Message

            ' Создать понятное сообщение об ошибке для пользователей.

            userErrMsg = "The file could not be opened, please contact " _

                & "your system administrator."

                 

        Catch ex AsDirectoryNotFoundException

            ' Аналогично предыдущему исключению.

            errMsg =ex.Message

            userErrMsg = "The file could not be opened, please contact " _

                & "your system administrator."

        End Try

    Else

        ' При первом запросе этой страницы создать текстовый файл.

        File.WriteAllText(physicalPath, userMessage)

    End If

EndCode

<!DOCTYPE html>

<html>

    <head>

        <title></title>

    </head>

    <body> 

    <form method="POST" action="">

      <input type="Submit" name="Submit" value="Open File" />

    </form>

     

    <p>@fileContents</p>

    <p>@userErrMsg</p>

     

    </body>

</html>