Asp обработка сведений, введенных пользователем


Содержание

Asp обработка сведений, введенных пользователем

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

Формы HTML, наиболее распространенный метод сбора сведений на основе веб, состоят из группы специальных тегов HTML, представляющих собой элементы пользовательского интерфейса на веб-странице. Текстовые поля, кнопки и флажки являются примерами элементов, позволяющих пользователям взаимодействовать с веб-страницей и отправлять сведения на веб-сервер.

Например, следующие теги HTML генерируют форму, в которую пользователь может ввести имя, фамилию и возраст, включающую кнопку для отправки сведений на веб-сервер. Эта форма также содержит скрытый тег ввода (не отображающийся в веб-обозревателе), который можно использовать для передачи на веб-сервер дополнительных сведений.

Подробное рассмотрение всех тегов формы HTML выходит за рамки данного раздела. Существует множество источников, рассматривающих создание полезных и удобных форм HTML. Например, с помощью средства просмотра исходного текста страниц используемого обозревателя можно посмотреть, как сделаны формы HTML на других веб-узлах. Кроме того, сведения о передовом использовании форм HTML и других технологий Интернета содержатся на веб-узле Microsoft MSDN Online по адресу http://msdn.microsoft.com/.

Когда форма HTML создана, необходимо обработать сведения, введенные пользователем, то есть, отправить их файлу .asp для анализа и других действий. Снова изучите программу HTML, приведенную в предыдущем примере. Заметьте, что атрибут ACTION тега

Если проверка формы требует доступа к базе данных, следует рассматривать проверку формы на стороне сервера. Самым удобным способом выполнения проверки на стороне сервера является создание формы, отправляющей сведения самое себе. То есть, файл .asp содержит форму HTML, возвращающую сведения, введенные пользователем. (Помните, что для взаимодействия со сценариями на стороне клиента и страницами HTML можно использовать ASP. Дополнительные сведения содержатся в разделе Взаимодействие с клиентскими сценариями). Введенные сведения передаются тому же файлу, который выполняет их проверку и оповещает пользователя, если во введенных сведениях допущена ошибка.

Использование этого способа обработки и проверки сведений, введенных пользователем, значительно увеличивает удобство использования и гибкость обработки веб-форм. Например, помещая ошибочные сведения, относящиеся к полю формы, куда были введены ошибочные сведения, упрощается задача поиска пользователем источника ошибки. (Обычно веб-формы пересылают запросы отдельной веб-странице, содержащей ошибочные сведения. Пользователи, которые не поймут эти сведения сразу, будут разочарованы).

Например, следующий сценарий определяет, ввел ли пользователь допустимый номер учетной записи, передавая сведения самому себе (Verify.asp) и вызывая пользовательскую функцию, выполняющую запрос к базе данных:

В этом примере сценарий находится в файле Verify.asp — в том же файле, который содержит форму HTML; он отправляет сведения самому себе, указывая в атрибуте ACTION файл Verify.asp.

Важно! Если для проверки на стороне сервера используется JScript, при назначении семейства локальной переменной не забудьте поставить пару пустых скобок после элемента семейства Request (QueryString или Form). Без скобок семейство будет возвращать объект, а не строку. Следующий сценарий иллюстрирует правильный способ назначения переменных в JScript:

Программа VBScript выполняется одинаково, если семейство содержит несколько значений, разделенных запятыми или индексируемых. Это значит, что и в VBScript, и в JScript вдобавок к добавлению пары пустых скобок к элементу семейства Request необходимо задать индекс требуемого значения. Например, следующая строка JScript возвращает лишь первое из нескольких значений элемента формы:

Asp обработка сведений, введенных пользователем

Этот текст предназначен для тех, кто никогда не имел дела с ASP и вообще смутно себе представляет возможности программирования на стороне сервера. Я ставил себе задачу создать у читателя общее представление о предмете. Отдельные неточности при этом менее важны — пожалуйста, громко не ругайтесь.

Общие сведения

ASP (Active Server Pages) – это мощная технология от Microsoft, позволяющая легко разрабатывать приложения для WWW. ASP работает на платформе Windows NT и IIS (Internet Information Server), начиная с версии 3, хотя вроде есть реализации на других платформах. ASP – это не язык программирования, это внутренняя технология, позволяющая подключать программы к Web-страницам. Основа успеха ASP – простой скриптовый язык (Visual Basic Script или Java Script) и возможность использования внешних COM-компонент.

Как это все происходит?

Вы пишете программу и складываете в файл на сервере. Браузер клиента запрашивает файл. Файл сначала интерпретируется сервером, на выходе производится HTML-код. Этот HTML посылается клиенту. Файлы с программами имеют расширение .asp. Файлы asp – это обычные текстовые файлы, содержащие исходные тексты программ. Файлы делаются с помощью любого текстового редактора. Каталог, в котором размещены файлы asp должен иметь права на выполнение, так как сервер исполняет эти файлы, когда браузер их запрашивает. Собственно программы пишутся на любом скриптовом языке, который установлен в системе. По умолчанию поддерживаются VBScript и JavaScript. Можно доустановить другие (например, Perl). Если ничего специально не указывать используется VBScript. В дальнейшем будем ссылаться только на него. Программные фрагменты заключаются в скобки . Можно ставить открывающую скобку в начале файла, закрывающую – в конце, все что между ними – программа на Visual Basic’е.

Какие средства есть для программирования?

Web – нормальная среда программирования, если правильно понять, что есть что. В VBScript есть все нормальные конструкции структурного программирования (if, while, case, etc). Есть переменные (описывать не обязательно, тип явно не задается). Поддерживаются объекты. Работа с ними обычная – Object.Property, Object.Method. Есть ряд встроенных объектов (Request, Response, Session, Server, Connection, Recordset). Можно доустанавливать другие компоненты (скачивать, покупать, программировать), например для работы с электронной почтой.

Вывод

Понятия «экран», куда можно выводить данные нет. Все, что надо показать пользователю, выбрасывается в выходной поток на языке HTML. Браузер пользователя интерпретирует этот HTML. Для упрощения вывода существует объект Response . Вывод осуществляется с помощью метода Write .

Так производится запись во внутренний буфер объекта Response. Когда скрипт заканчивает работу, весь буфер выдается клиенту. Надо заметить, что клиент получает «чистый» HTML, таким образом программы на ASP не зависят от клиентского ПО, что очень важно. Если внутри выводимой строки нужно использовать кавычку, кавычка удваивается. Другие методы и свойства Response позволяют управлять выводом. Так Response.Buffer регулирует, получает ли клиент данные по мере из записи в Response, или все сразу по завершении исполнения страницы. Метод Response.Redirect перенаправляет браузер на другую страницу. Чтобы им пользоваться, нельзя до него на странице использовать Response.Write.

Программа на ASP не может явно спросить пользователя о чем-то. Она получает данные из других страниц, либо через URL. Передаваемые параметры помещаются во входной поток и доступны через объект Request . Чтобы передать переменную var в программу test.asp , надо написать:

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

Несколько переменных разделяется знаком &:

Кроме того, чтобы задавать параметры в URL, можно воспользоваться формами HTML. В вызывающей странице пишем так:

Так это выглядит:

При этом пользователь увидит форму из одного поля ввода (var1), в нем будет значение по умолчанию «default». Второе поле (var2) будет невидимо и будет передавать всегда фиксированное значение «var2value». Кнопка «Submit Form» завершает заполнение формы и передает все переменные на test.asp (action). Если method=»get», переменные передаются через URL (test.asp?var1=default&var2=var2value). Если method=»post», передаются вместе с запросом так, что внешне передача переменных не заметна. В вызываемой программе безразлично, какой метод изпользовался (почти). Если у вас нет специальных аргументов за метод GET, используйте метод POST.

Формы

Формы HTML используются для организации диалога с пользователем. Поддерживаются стандартные элементы управления. Все многообразие задается немногими тэгами:

  • INPUT (с параметром TYPE=)
  • SELECT
  • TEXTAREA

Описание – в документации по HTML.

Взаимосвязь между отдельными страницами

Обычно сервер WWW не хранит состояние приложения, т.е. все запросы взаимонезависимы, и нет стандартного способа понять, что несколько запросов пришли от одного и того же пользователя. Но это очень нужно для разработки полноценных приложений и является одной из главных проблем разработки Web-приложений.

Один из методов решения этой проблемы — cookies . Пользователю при первом обращении выдается специальный идентификатор, после этого браузер пользователя предъявляет этот идентификатор при каждом обращении, и сервер может распознать, что это тот же самый пользователь. Пользователь может отключить cookies, в этом случае этот метод не работает.

ASP, используя cookies, предоставляет программисту более простое средство — объект Session (сессия). Сессия стартует, когда новый пользователь обращается к любому asp-файлу приложения. Сессия заканчивается при отсутствии активности пользователя в течение 20 минут, либо по явной команде. Специальный объект Session хранит состояние сессии. Туда можно записывать переменные, которые доступны из любой страницы в этой сессии. Записать данные в этот объект можно просто:

Считать потом еще проще:

Сессия, таким образом, – это еще один метод передачи данных между страницами. Одна страница пишет данные в сессию, другая – берет потом оттуда.

Наряду с объектом Session существует объект Application . Если сессия создается для каждого нового пользователя, до Application существует в единственном экземпляре, и может использоваться всеми страницами приложения.

Управление приложением

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

Нужно «просто» вписать Ваш код на соответствующее место. Нужно заметить, что отлаживать код для global.asa довольно непросто, так как он выполняется при очень специфических обстоятельствах (к примеру при старте или остановке сервера).

Использование внешних компонент

Если на сервере установлены дополнительные компоненты, их можно использовать из ASP. Стандартные объекты (например из библиотек ADO (Connection и Recordset) и Scripting (Dictionary, FileSystemObject)) доступны всегда. Установка новой компоненты обычно состоит в копировании dll-файла в каталог на сервере и ее регистрации с помощью программы regsvr32.exe. [В COM+ используется своя процедура инсталляции объектов, это однако не влияет на использования объектов.]

Создать экземпляр объекта можно так:

Class.Object указываются в документации на компоненту. В переменной var запоминается ссылка на созданный экземпляр объекта. Когда объект не нужен, ссылку нужно обнулить с помощью команды:

Пожалуйста всегда обнуляйте все ссылки на объекты, когда они больше не нужны. Теоретически это должно происходить автоматически при завершении процедуры/страницы, однако в стандартной сборке мусора есть определенные «проблемы».

В остальном использование компоненты зависит от самой этой компоненты.

Работа с базами данных

Из ASP можно легко и просто работать с любыми базами данных. Это делается через две промежуточные технологии: ODBC и ADO.

ODBC позволяет организовать доступ к любым базам данных через унифицированный интерфейс с помощью языка SQL. Специфика конкретных СУБД учитывается при помощи специальных драйверов БД. Такие драйверы существуют для всевозможных СУБД (в частности SQL Server, Oracle, Access, FoxPro). Поддержка ODBC обеспечивается на уровне операционной системы Windows (NT). Настройка – через Control Panel/ODBC. Базовым понятием является источник данных или data source. Источник данных – это совокупность сведений о базе данных, включая ее драйвер, имя компьютера и файла, параметры. Чтобы пользоваться базой надо создать источник данных для нее. Важно, чтобы источник данных был «системным», в отличии от «пользовательского». После этого надо лишь знать имя источника данных. [В настоящее время ODBC отступает перед натиском технологии OLE DB. На практике это однако практически ничего не изменяет. Вместо имени источника данных нужно использовать Connection String, в которой указывается имя ODBC-драйвера и все его параметры.]

ADO – это совокупность объектов, доступных из ASP, позволяющих обращаться к источнику данных ODBC [или OLE DB]. Фактически нужны лишь 2 объекта – Connection , представляющий соединение с базой данных и Recordset , представляющий набор записей, полученный от источника. Сначала необходимо открыть соединение, потом к нему привязать Recordset, потом, пользуясь методами Recordset’а, обрабатывать данные. Вот пример:

Если команда SQL не возвращает данных, recordset не нужен, надо пользоваться методом Conn. Execute (SQL_COMMAND).

Если Вы хотите вызывать хранимые процедуры сервера БД с параметрами, нужно воспользоваться объектом Command , который в свою очеред содержит объекты Parameter .

Методики программирования, советы


Описание переменных

VBScript — очень нетребовательный к программисту язык. Так он не требует описывать переменные и не содержит явных типов данных. Все переменные принадлежат одному типу Variant . Из-за отсутствия описаний могут произойти очень трудно обнаруживаемые ошибки. Одна опечатка может стоить полдня поисков.

Однако, есть возможность явно потребовать описания переменных. Для этого первой строкой в ASP-файле нужно написать Option Explicit . После этого обращение к переменной, которая не была объявлена с помощью Dim , вызывает ошибку с указанием номера строки.

Кстати, где расположены описания Dim в процедуре — совершенно не важно. Они могут стоять как до использования переменной, так и после, и даже в цикле. Видимо они отрабатываются препроцессором. Явно задать тип переменной с помощью Dim Var as Typ , как в Visual Basic, все равно нельзя.

Чередование ASP/HTML

Если нужно выдать большой кусок HTML, можно не пользоваться Response.Write. Если в asp-файле встречается кусок текста вне скобок , он трактуется просто как HTML, который надо вывести. Пример:

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

Для отслеживания ошибок используется специальный объект Err . Он устанавливается в ненулевое значение, если предыдущая команда породила ошибку. Ее можно проверять с помощью If, и таким образом реагировать на ошибки. Чтобы из-за ошибки не прерывалось выполнение программы, в начале нужно включить команду

Включение других файлов

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

Важно: все includes в тексте отрабатываются до исполнения файла. Т.е. даже если include стоит внутри if, то сначала будут включены все includes во всех ветках, и только потом, во время исполнения, будет принятно решение, какую ветку выполнять. Т.е. следующий код не дает условного включения файлов:

Обработка форм

Если надо что-то спросить у пользователя и на основании этого что-то сделать, в простейшем случае создается два файла: один с формой, второй – с ее обработчиком. Обработчик выполняет все действия. Пример:

Рекурсивная обработка форм

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

Переменные HTTP

Запрос от браузера, кроме запрашиваемой страницы несет еще некоторые данные. Эти данные, например, IP-адрес клиента, доступны через специальные переменные объекта Request. IP-адрес – Request(«REMOTE_ADDR»). Другие — см.документацию (ASPSamp\Samples\srvvar.asp).

Переадресация

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

Только надо следить, чтобы до выполнения команды redirect ничего не было записано в Response (даже коментарии HTML).

Электронная почта

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

7. Проверка ввода пользователя

Элементы управления для проверки ввода пользователя (validation controls) в ASP.NET 2.0, CompareValidator, CustomValidator, RangeValidator, RegularExpressionValidator, RequiredFieldValidator, ValidationSummary

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

В ASP.NET проверка всегда производится на сервере плюс в добавление к серверной проверке можно реализовать проверку и на клиенте. Только на клиенте реализовать проверку нельзя: по соображениям безопасности она всегда дублируется на сервере.

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

Если проверка вернула ошибку, то обычно выводится сообщение и обработка страницы прекращается до тех пор, пока пользователь не исправит значение.

Проверки — это еще и защита Web -приложения от хакеров. Стандартно используются две атаки:

· spoofing — хакер генерирует специальный код и посылает его серверу, сообщая, что он «прошел» проверку на клиенте. ASP . NET за счет обязательного дублирования проверок такой класс атак отметает радикально.

· если пользователь может вводить текст неограниченной длины в поля Web-формы, то можно нарваться на переполнение буфера, атаку DDOS или прочие вещи. Проверки и ограничения позволяют решить эту проблему.

Клиентские проверки в ASP.NET реализуются средствами DHTML и JScript . Серверные проверки могут быть реализованы на любом .NET-совместимом языке. Работу с проверками очень упрощает то, что для проверок заранее заготовлены специальные элементы управления — val >s .

Клиентские проверки (в IE4.0 и более поздних версиях) срабатывают, когда пользователь нажимает на кнопку Submit и работают до отправки данных на Web-сервер. Если проверка не пройдена, данные и не будут посланы на Web-сервер.

В IE5.0 и более поздних, в которых поддерживается DHTML, проверки также могут срабатывать для конкретного элемента управления, когда он теряет фокус.

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

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

Какие элементы управления ASP.NET позволяют реализовать проверки клиентского ввода:

· Compare V alidator — ввод пользователя сравнивается со значением в другом элементе управления, фиксированным значением, со значением из файла или проверяется на соответствие типу данных. Используется очень часто (например, для проверки правильности ввода пароля в двух полях);

· CustomValidator — можно реализовать свой собственный код проверки (например, проверяем, правильно ли указан номер телефона и т.п.)

· RangeValidator — проверка, попадает ли введенное пользователем значение в указанный диапазон (например, проверка возраста)

· RegularExpressionValidator — проверка по шаблону (на соответствие подстановочным символам). Проверяем адреса e-mail, почтовые индексы, ИНН, телефонные номера и т.п. Наиболее часто используемые шаблоны уже реализованы в .NET

· RequiredFieldValidator — просто проверяется, введено пользователем значение в это поле или нет;

· ValidationSummary — предназначено для вывода информации о всех ошибках проверки (чтобы пользователь знал, что ему исправлять). Обычно помещается недалеко от кнопки Submit.

Теперь — непосредственно о работе с этими элементами управления.

Принцип работы с validation controls достаточно простой:

1) при помощи T oolbox помещаем на форму нужный validation control;

2) настраиваем его свойство ControlToValidate, определяя тем самым, значение какого элемента управления будет проверяться. Одному обычному элементу управления можно назначить много validation controls. Пока все они не вернут True, будет генерироваться ошибка проверки.

3) настраиваем прочие свойства validation control — выражение для проверки, текст сообщения об ошибке и т.п.

Свойства у разных элементов управления validation разные, но у каждого из них (кроме validation summary) есть два общих свойства:


· Type — проверяемый тип данных

· EnableClientScript — нужно ли реализовывать данную проверку на клиенте (по умолчанию нужно). Клиентские проверки всегда будут созданы на JScript.

Validation controls нужно размещать не в любом месте формы, а в правильном, поскольку при возникновении ошибки на месте vc выводится сообщение. Желательно, конечно, располагать его рядом с проверяемым ЭУ.

По умолчанию то сообщение, которое будет выводиться на месте VC и передаваться ValidationSummary , определяется свойством ErrorMessage . Однако текст сообщения, которое будет выводиться на месте VC, можно переопределить при помощи свойства Text. ValidationSumary всегда передается значение ErrorMessage. Если вы используете в форме ValidationSummary, то ЭУ, значение в котором вызвало ошибку, будет помечен красной звездочкой.

То, как будет выглядеть сообщение об ошибке на месте VC, определяется его свойством Display. Это свойство может принимать три значения:

· Static (по умолчанию) — место под этот элемент управления всегда будет зарезервировано на странице;

· Dynamic — этот элемент управления будет рендериться, как все остальные, и если сообщения нет, его место будет занято другими компонентами формы

· None — вывод сообщения на месте VC будет вообще подавлен.

Иногда приходится к одному обычному ЭУ привязывать сразу несколько проверяющих. Например, у нас есть поле для ввода телефона. Нам может потребоваться проверять его сразу тремя проверяющими элементами:

· RequiredFieldValidator — чтобы пользователь не забыл его заполнить;

· RegularExpressionField — на соответствие маске;

· CustomValidator — есть ли уже такой номер в нашей базе.

Некоторые особенности работы с проверяющими элементами управления.

Для самого простого элемента управления RequiredFieldVal >InitialValue . Это — то значение, с которым не должно совпасть проверяемое поле. По умолчанию оно пусто, и, значит, пользователь не может оставить значение в проверяемом поле пустым. Если у вас для проверяемого поля используется значение по умолчанию, то значение RequiredFieldValidator желательно поменять на такое же значение.

Проверять на пустое значение можно только при помощи RequiredFieldValidator. Если вам нужно проверять на пустое значение и на что-то еще, используется RequiredFieldValidator и дополнительный проверяющий элемент управления.

Для CompareValidator используются следующие свойства:

· ValueToCompare — проверка на соответствие константным значениям. Можно указывать несколько константных значений (их нужно будет разделять вертикальной чертой — |).

· ControlToCompare — проверка на соответствие значению из другого элемента управления. Обычно для сравнения двух значений паролей.

· Type — проверка на соответствие типу данных.

· Operators — здесь придется указывать имя операторов сравнения: Equal , NotEqual , GreaterThen , GreaterThanEqual и т.п.

Для RangeVal >MinimumValue , MaximumValue и Type .

Особенности работы с RegularExpressionValidator : главное свойство — ValidationExpression . При нажатии на него появляется большое список готовых шаблонов. Можно использовать и свой шаблон (Custom). Список подстановочных символов, которые можно использовать, очень большой.

CustomValidator — самый мощный и самый сложный проверяющий элемент управления. Можно проверять на соответствие формуле, значению из источника данных, значению, возвращаемому COM-компонентом или Web-службой. Используется в сложных ситуациях, например, для проверки паролей, база которых хранится на сервере.

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

· ClientValidationFunction — клиентский проверяющий скрипт;

· OnServerValidate — серверный скрипт.

Конечно, логическое соответствие клиентского и серверного скрипта вам придется обеспечивать и проверять самостоятельно.

Серверная функция для CustomVal >

Клиентскую процедуру надо писать на JScript вручную на странице HTML (не Codebehind ), сразу после тега Head, например так:

function MyClientValidation(source, arguments)

alert(«I am running on the client! «);

var intValue = arguments.Value;

if (intValue % 2 == 0)

Затем в свойствах CustomValidator для свойства ClientValidationFunction указать имя этой функции , а для свойства EnableClientScript установить значение True. Желательно также определиться с версией броузера, в которой будет выполняться этот скрипт. Для этого нужно открыть свойства страницы (из контекстного меню в дизайнере, щелкнув правой кнопкой по пустому месту в странице) и для свойства Target Schema выбрать нужный броузер, например, I nternet Explo rer 5.0.

Теперь — о ValidationSummary и Page . IsValid .

Обычно, прежде чем продолжать обработку страницы, необходимо убедиться, что все проверяющие элементы управления дали на это «добро». Для проверки всех серверных элементов управления используется свойство Page.IsVal >ValidationSummary .

Свойство IsValid для страницы объединяет через логическое И все проверяющие ЭУ на странице. Если хотя бы один такой элемент вернул false, то IsValid возвращает false.

Информация проверки недоступна во время инициализации и загрузки страницы — только после.

Пример кода для кнопки, в котором проверяется свойство isValid:

Sub cmdSubmit_Click (s As Object, e As EventArgs)

If Page.IsValid Then

Message.Text = «Page is valid!»

’ Perform database updates or other logic here

Если на странице был создан элемент управления ValidationSummary , то он отработает на сервере автоматически, если Is V al >ValidationSummary :

· HeaderText — заголовок списка;

· DisplayMode — отражать сообщения маркированным списком или просто абзацем

· ShowSummary — выводить ли список на странице (по умолчанию true).

· ShowMessageBox — выводить ли список в окне сообщения (по умолчанию false).

Создание простого приложения по вводу данных

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

Набросаем план

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

  • Главная страница, где отображается информация о вечеринке
  • Форма, которая может быть использована для RSVP
  • Валидация RSVP формы, которая отобразит страницу с благодарностью
  • Заполненный и отправленный ответ о согласии принять участие в вечеринке

В следующих разделах мы будем наращивать MVC проект, который мы создали в начале главы, и добавим эти возможности. Мы можем сделать первый пункт из списка, применив те знания то, которые мы получили ранее, то есть мы можем добавить HTML для наших существующих представлений, где будет дана подробная информация о вечеринке. В листинге 2-7 показаны дополнения, которые мы сделали в файле Views/Home/Index.cshtml .

Листинг 2-7: Отображение информации о вечеринке

Мы на правильном пути. Если вы запустите приложение, вы увидите информацию о вечеринке, ну, вернее, метку-заполнитель (placeholder) для этой информации, но вы можете уловить суть. Пример показан на рисунке 2-12.

Рисунок 2-12: Добавление представления

Проектирование модели данных

В MVC М обозначает модель, и это является самой важной частью приложения. Модель является представлением реальных объектов, процессов и правил, которые определяют объект, известный как домен, нашего приложения. Модель, которая часто упоминается как доменная модель, содержит C# объекты (известные как доменные объекты), которые составляют суть нашего приложения, и методы, которые позволяют нам манипулировать ими. Представления и контроллеры раскрывают домен клиентам в согласованном порядке, и хорошо продуманное MVC приложение начинается с хорошо продуманной модели, которая затем является координационным центром, когда мы добавляем контроллеры и представления.

Нам не нужна сложная модель для приложения PartyInvites , но мы создадим один доменный класс, которые мы назовем GuestResponse . Этот объект будет отвечать за хранение, проверку и подтверждение RSVP.

Добавление класса модели

По MVC соглашению классы, которые составляют модель, помещаются в папку Models . Щелкните правой кнопкой мыши по Models в окне Solution Explorer и выберите Add , за которым следует Class , из всплывающего меню. Назовите файл GuestResponse.cs и нажмите кнопку Add , чтобы создать класс. Измените содержимое класса в соответствии с листингом 2-8.

Если у вас нет пункта меню Class , то вы, вероятно, оставили работать отладчик (дебаггер) Visual Studio. Visual Studio ограничивает изменения, которые можно внести в проект, если приложение запущено.

Листинг 2-8: Доменный класс GuestResponse

Вы, возможно, заметили, что свойство WillAttend имеет тип bool? ( Nullable ), то есть оно может быть true , false или null . Мы объясним это в разделе «Добавление валидации» далее в этой главе.

Ссылка на метод действия

Одна из целей нашего приложение заключается во включении RSVP формы, поэтому нам нужно добавить ссылку на нее из нашего представления Index.cshtml , как показано в листинге 2-9.

Листинг 2-9: Добавление ссылки для RSVP формы

Html.ActionLink является вспомогательным методом HTML. MVC Framework разработан с набором встроенных вспомогательных методов, которые удобны для обработки HTML ссылок, текстовых вводных данных, флажков, выборок и даже пользовательских элементов управления. Метод ActionLink принимает два параметра: первый – это текст для отображения в ссылке, а второй – это выполняемое действие, когда пользователь нажимает на ссылку. Мы объясним вспомогательные методы HTML в главах 19-21. На рисунке 2-13 показана ссылка, которую мы добавили.

Рисунок 2-13: Добавление в представление ссылки

Если вы наведете курсор мыши на ссылку в браузере, вы увидите, что ссылка указывает на http://yourserver/Home/RsvpForm . Метод Html.ActionLink проверил конфигурацию URL нашего приложения и определил, что /Home/RsvpForm является URL для действия RsvpForm контроллера HomeController . Обратите внимание, что в отличие от традиционных приложений ASP.NET, URL-адреса MVC не соответствуют физическим файлам. Каждый метод действия имеет свой URL, и MVC использует систему маршрутизации ASP.NET перевести эти URL в действия.

Создание метода действия

Если вы нажмете на ссылку, то увидите ошибку 404 Not Found . Это потому что пока еще мы не создали метод действия, который соответствует URL /Home/RsvpForm . Мы сделаем это путем добавления метода RsvpForm нашему классу HomeController , как показано в листинге 2-10.

Листинг 2-10: Добавление в контроллер нового метода действия

Добавление строго типизированного представления

Мы хотим добавить представление для нашего метода действия RsvpForm , но мы собираемся сделать кое-что больше: то есть создать строго типизированное представление. Строго типизированные представления предназначены для обработки определенного типа доменов. Если мы укажем тип, с которым мы хотим работать (в этом примере GuestResponse ), MVC предоставит дополнительные возможности, чтобы упростить нам задачу.

Убедитесь, что перед работой ваш MVC проект скомпилирован. Если вы создали класс GuestResponse , но не скомпилировали его, MVC не сможет создать строго типизированное представление для данного типа. Чтобы скомпилировать приложение, выберите Build Solution в Visual Studio меню Build .

Щелкните правой кнопкой мыши внутри метода действия RsvpForm и выберите для создания представления Add View из всплывающего меню. В диалоговом окне Add View поставьте галочку на Create a strongly-typed view и выберите опцию GuestResponse из выпадающего меню. Снимите флажок с Use a layout or master page и убедитесь, что Razor выбран в качестве движка представления, и что опция Scaffold template установлена на Empty , как показано на рисунке 2-14.

Рисунок 2-14: Добавление строго типизированного представления

Нажмите кнопку Add , и Visual Studio создаст новый файл с именем RvspForm.cshtml и откроет его для редактирования. Вы можете увидеть первоначальное содержание в листинге 2-12. Как вы заметили, это другой HTML файл, но он содержит Razor выражение @model . Вы сейчас увидите, что это является ключом к строго типизированному представлению и возможностям, которые оно предлагает.

Листинг 2-12: Начальное содержимое файла RsvpForm.cshtml

Построение формы

Теперь, когда мы создали строго типизированное представление, мы можем выстроить содержание RsvpForm.cshtml , чтобы превратить его в HTML форму для редактирования GuestResponse объектов. Измените представление так, чтобы оно соответствовало листингу 2-13.

Листинг 2-13: Создание представления формы

Для каждого свойства класса модели GuestResponse мы используем вспомогательный метод HTML, чтобы обработать подходящий HTML элемент управления input . Эти методы позволяют выбрать свойство, к которому относится элемент input , с помощью лямбда-выражения, например вот так:

Вспомогательный метод HTML TextBoxFor генерирует HTML для элемента input , устанавливает параметр type на text и устанавливает атрибуты id и name на Phone , имя выбранного свойства доменного класса, вот так:

Эта удобная функция работает, потому что наше представление RsvpForm строго типизировано, и мы сказали MVC, что GuestResponse это тот тип, который мы хотим обработать при помощи данного представления, поэтому вспомогательные методы HTML могут понять, какой тип данных мы хотим прочитать, с помощью выражения @model .

Не волнуйтесь, если вы не знакомы с лямбда-выражениями C#. Мы расскажем о них в главе 4, но в качестве альтернативы лямбда-выражениям вы можете обратиться к имени свойства типа модели как к строке, например, вот так:

Мы считаем, что методика лямбда-выражений помогает нам не делать опечаток в имени свойства типа модели, потому что всплывает Visual Studio IntelliSense и позволяет нам выбрать свойство автоматически, как показано на рисунке 2-15.

Рисунок 2-15: Visual Studio IntelliSense для лямбда-выражений во вспомогательных методах HTML

Другим удобным вспомогательным методом является Html.BeginForm , который генерирует элемент HTML формы, настроенный на обратную передачу данных методу действия. Поскольку мы не передали вспомогательному методу никаких параметров, он предполагает, что мы хотим передать обратно тот же URL. Ловким трюком является то, чтобы обернуть это в C# выражение using , вот таким образом:

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

Вместо удаления объекта, помощник HtmlBeginForm закрывает HTML элемент form , когда он выходит из области видимости. Это означает, что вспомогательный метод Html.BeginForm создает обе части элемента form , например:

Не волнуйтесь, если вы не знакомы с удалением объектов в C#. Наша цель на данный момент состоит в том, чтобы показать, как создать форму с помощью вспомогательного метода HTML. Вы можете видеть форму в представлении RsvpForm , когда вы запустите приложение и нажмете ссылку RSVP Now . На рисунке 2-16 показан результат.

Рисунок 2-16: Представление RspvForm

Это не книга о CSS или веб дизайне. По большей части мы будем создавать примеры, внешний вид которых может быть описан как устаревший (хотя мы предпочитаем термин классический, в котором чувствует меньше пренебрежения). MVC представления генерируют очень чистый и простой HTML, и вы можете полностью управлять версткой элементов и классов, к которым они принадлежат, поэтому у вас не будет проблем с использованием дизайнерских средств или готовых шаблонов, чтобы сделать ваш MVC проект красивым.

Обработка форм

Мы не сказали MVC, что мы хотим сделать, когда форма отправляется на сервер. На данный момент нажатие на кнопку Submit RSVP просто удаляет любые значения, которые вы ввели в форму. Это потому что форма отправляется обратно методу действия RsvpForm в контроллере Home , который просто говорит MVC обработать представление еще раз.

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

Чтобы получить и обработать отправленные данные формы, мы собираемся сделать умную и классную вещь. Мы добавим второй метод действия RsvpForm для того, чтобы создать следующее:

  • Метод, который отвечает на HTTP GET запросы: GET запрос является тем, с чем браузер имеет дело после каждого клика по ссылке. Этот вариант действий будет отвечать за отображение начальной пустой формы, когда кто-то первый раз посетит /Home/RsvpForm .
  • Метод, который отвечает на HTTP POST запросы: По умолчанию, формы, обрабатываемые при помощи Html.BeginForm() , отправляются браузером как POST запросы. Этот вариант действий будет отвечать за получение отправленных данные и решать, что с ними делать.

Обработка GET и POST запросов в отдельных методах C# помогает сохранить наш код опрятным, так как оба метода имеют различные обязанности. Оба метода действия вызываются одним и тем же URL, но MVC гарантирует, что будет вызван соответствующий метод в зависимости от того, имеем ли мы дело с GET или с POST запросом. В листинге 2-14 показаны изменения, которые мы должны сделать в классе HomeController .


Листинг 2-14: Добавление метода действия для поддержки POST запросов

Мы добавили атрибут HttpGet для нашего существующего метода действия RsvpForm . Это говорит MVC, что данный метод должен использоваться только для GET запросов. Затем мы добавили перегруженную версию RsvpForm , который принимает параметр GuestResponse и применяет атрибут HttpPost . Атрибут говорит MVC, что новый метод будет иметь дело с POST запросами. Обратите внимание, что мы также импортировали пространство имен PartyInvites.Models – таким образом мы можем обратиться к типу модели GuestResponse без необходимости указывать имя класса. Мы расскажем, как работают наши дополнения в листинге, в следующих разделах.

Использование связывания данных модели

Первый вариант перегруженного метода действия RsvpForm обрабатывает то же представление, что и раньше. Она генерирует форму, показанную на рисунке 2-16. Второй вариант перегруженного метода является более интересным из-за параметра, но, учитывая, что метод действия будет вызываться в ответ на HTTP POST запрос, и что GuestResponse является типом класса C #, то как они объединены?

Ответом является связывание данных модели – чрезвычайно полезная функциональная особенность MVC, когда входные данные разбиваются (парсятся) и пары ключ/значение в HTTP запросе используются для заполнения свойств типа доменной модели. Этот процесс является противоположностью использования вспомогательных методов HTML; это когда при создании данных формы для отправки клиенту, мы генерировали HTML элементы input , где значения атрибутов id и name были получены из названий свойств классов моделей.

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

Модель представления данных является мощной и настраиваемой функцией, которая избавляет от рутины работы напрямую с HTTP-запросами и позволяет нам работать с C# объектами, а не иметь дело со значениями Request.Form[] и Request.QueryString[] . Объект GuestResponse , который передается в качестве параметра нашему методу действия, автоматически заполняется данными из полей формы. Мы рассмотрим подробно модель представления данных, а также в том числе, как ее можно настроить, в главе 22.

Обработка других представлений

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

Этот вызов метода View говорит MVC найти и обработать представление, которое называется Thanks , и передать представлению наш объект GuestResponse . Чтобы создать представление, которое мы указали, щелкните правой кнопкой мыши внутри одного из методов HomeController и выберите пункт Add View из всплывающего меню. Установите имя представления на Thanks , как показано на рисунке 2-17.

Рисунок 2-17: Добавление представления Thanks

Мы собираемся создать еще одно строго типизированное представление, поэтому поставьте галочку на этом пункте в диалоговом окне Add View . Класс данных, который мы выберем для этого представления, должен соответствовать классу, который мы передали представлению при помощи метода View . Поэтому убедитесь, что в выпадающем меню выбран GuestResponse . Убедитесь, что нет галочки на Use a layout or master page , View engine установлен на Razor, а также Scaffold template установлен на Empty .

Нажмите кнопку Add , чтобы создать новое представление. Поскольку представление связано с контроллером Home , MVC создаст представление как

/Views/Home/Thanks.cshtml . Измените новое представление так, чтобы оно соответствовало листингу 2-15: мы выделили то, что нужно добавить.

Листинг 2-15: Представление Thanks

Представление Thanks использует Razor для отображения контента на основе значения свойства GuestResponse , которые мы передали методу View в методе действия RsvpForm . Razor оператор @model определяет тип доменной модели, с которым связано представление. Чтобы получить доступ к значению свойства доменного объекта, мы используем Model.PropertyName . Например, чтобы получить значение свойства Name , мы вызываем Model.Name . Не волнуйтесь, если вам не понятен синтаксис Razor, мы объясним это подробно в главе 5.

Теперь, когда мы создали представление Thanks , у нас есть базовый рабочий пример обработки формы при помощи MVC.

Запустите приложение в Visual Studio, нажмите на ссылку RSVP Now , добавьте в форму данные и нажмите на кнопку Submit RSVP . Вы увидите результат, показанный на рисунке 2-18 (хотя он может отличаться, если ваше имя не Джо, и вы сказали, что не сможете присутствовать).

Рисунок 2-18: Обработанное представление Thanks

Добавление валидации

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

В приложении MVC проверка, как правило, применяется к доменной модели, а не к пользовательскому интерфейсу. Это обозначает, что мы определяем наши критерии валидации в одном месте, и они вступают в силу в любом месте используемого класса модели. ASP.NET MVC поддерживает правила проверки, определяемые атрибутами пространства имен System.ComponentModel.DataAnnotations . В листинге 2-16 показано, как эти атрибуты могут быть применены к классу модели GuestResponse .

Листинг 2-16: Применение валидации к классу модели GuestResponse

Правила валидации выделены жирным шрифтом. MVC автоматически обнаруживает атрибуты и использует их для проверки данных во время представления модели данных. Обратите внимание, что мы импортировали пространство имен, содержащее правила валидации, поэтому мы можем ссылаться на них без необходимости указывать их имена.

Как отмечалось ранее, мы использовали тип bool? для свойства WillAttend , поэтому мы смогли применить атрибут валидации Required . Если бы мы использовали обычный bool , значение, которое мы могли бы получить благодаря модели представления данных, могло бы быть только true или false , и мы не были бы сказать, выбрал ли пользователь значение. Тип bool? имеет три возможных значения: true , false и null . Значение null будет использовано, если пользователь не выбрал значение, и это заставляет атрибут Required сообщить об ошибке валидации.

Мы можем проверить, была ли ошибка валидации проверкой с помощью свойства ModelState.IsValid в нашем классе контроллера. В листинге 2-17 показано, как это можно сделать в нашем методе действия RsvpForm с поддержкой POST .

Листинг 2-17: Проверка на наличие ошибок при валидации формы

Если ошибки валидации нет, мы говорим MVC обрабатывать представление Thanks , как мы делали ранее. Если ошибка валидации есть, мы вновь обрабатываем представление RsvpForm , вызвав метод View без параметров.

Просто отображать форму, когда есть ошибка, не очень полезно, мы должны дать пользователю некоторую информацию о том, в чем заключается проблема, и почему мы не можем принять его форму. Мы делаем это с помощью вспомогательного метода Html.ValidationSummary в представлении RsvpForm , как показано в листинге 2-18.

Листинг 2-18: Использование вспомогательного метода Html.ValidationSummary

Если ошибок нет, метод Html.ValidationSummary создает скрытый элемент списка в качестве заполнителя в форме. MVC делает метку-заполнитель видимой и добавляет сообщения об ошибке, определяемые атрибутами валидации. Вы можете увидеть, как это выглядит, на рисунке 2-19.

Рисунок 2-19: Сводка результатов валидации

Пользователю не будет показано представление Thanks , пока не будут удовлетворены все правила валидации, которые мы применили к классу GuestResponse . Обратите внимание, что данные, введенные в форму, были сохранены и отображаются снова, когда представление показано со сводкой валидации. Это еще одно преимущество связывания данных.

Если вы работали с ASP.NET Web Forms, вы знаете, что в Web Forms существует понятие «серверные элементы управления», которые сохраняют состояние, сериализуя значения в скрытом поле формы __VIEWSTATE . Связывание данных ASP.NET MVC не привязано к Web Forms концепции серверных элементов управления, обратной передачи данных или View State. ASP.NET MVC не вводит скрытое поле __VIEWSTATE в обрабатываемые HTML страницы.

Выделение невалидных полей

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

Если свойство класса модели не прошло валидацию, вспомогательные методы HTML будут генерировать немного другой HTML. В качестве примера, вот HTML, который генерирует вызов Html.TextBoxFor (х => x.Name) , когда нет ошибки валидации:

А вот HTML, который генерирует тот же вызов, когда пользователь не предоставил значение (что является ошибкой валидации, потому что мы применили атрибут Required свойства Name в классе модели GuestResponse ):

Мы выделили различия. Это вспомогательный метод добавил класс с именем input-validation-error . Мы можем воспользоваться этой функцией, создав таблицу стилей CSS, которая содержит стили для этого класса и других, что применяют различные вспомогательные методы HTML.

Соглашение в MVC проектах заключается в том, что статический контент, такой как таблицы стилей CSS, помещается в папку под названием Content . Мы создали папку Content , нажав правой кнопкой мыши по проекту PartyInvites в Solution Explorer и выбрав из всплывающего меню Add New Folder . Мы создали таблицу стилей, щелкнув правой кнопкой мыши по папке Content , выбрав Add New Item и затем выбрав Style Sheet в диалоговом окне Add New Item . Мы назвали нашу таблицу стилей Site.css , и это имя, которое Visual Studio использует при создании проекта с использованием иного шаблона MVC, а не Empty. Вы можете посмотреть содержимое файла Content/Site.css в листинге 2-19.

Листинг 2-19: Содержимое файла Content/Site.css

Чтобы использовать эту таблицу стилей, мы добавили новую ссылку в раздел head представления RsvpForm , как показано в листинге 2-20. Вы добавляете представлениям элементы link так же, как в обычном статическом HTML файле.

Листинг 2-20: Добавление элемента link в представление RsvpForm

Если вы использовали MVC 3, то могли ожидать, чтобы мы добавим CSS файл к представлению, указав атрибут href как @Href(«

/Content/Site.css») или @Url.Content(«

/Content/Site.css») . С MVC 4 Razor автоматически обнаруживает атрибуты, которые начинаются с

/ , и автоматически вставляет для вас @Href или @Url .

Теперь будет отображаться визуально более очевидная ошибка валидации, если были представлены данные, которые вызвали эту ошибку, как показано на рисунке 2-20.

Рисунок 2-20: Автоматически выделенные ошибки валидации

Завершаем пример

Последнее требование к нашему примеру приложения заключается в том, чтобы отправить имейл с завершенными RSVP нашему другу, организатору вечеринки. Мы могли бы сделать это, добавив метод действия, чтобы создать и отправить по электронной почте сообщение, используя e-mail классы .NET Framework. Вместо этого мы собираемся использовать вспомогательный метод WebMail . Это не входит в рамки MVC, но это позволит нам завершить данный пример, не увязнув в деталях создания других средств отправки электронной почты.

Мы использовали вспомогательный метод WebMail , потому что он позволяет нам с минимальными усилиями продемонстрировать отправку сообщений электронной почты. Однако, в обычной ситуации мы предпочли бы переложить эту функцию на метод действия. Мы объясним, почему, когда будем описывать архитектурный MVC паттерн в главе 3.

Мы хотим, чтобы имейл сообщение было отправлено, когда мы обрабатываем представление Thanks . В листинге 2-21 показаны изменения, которые мы должны сделать.

Листинг 2-21: Использование вспомогательного метода WebMail

Мы добавили Razor выражение, которое использует вспомогательный метод WebMail для настройки информации о нашем сервере электронной почты, включая имя сервера, требует ли сервер SSL соединения и данных учетной записи. После того как мы все настроили, мы используем метод WebMail.Send для отправки электронной почты.

Мы включили весь имейл код в блок try. catch , чтобы мы могли предупредить пользователя, если электронная почта не отправилась. Мы делаем это путем добавления текстового блока к выходным данным представления Thanks . Лучше было бы отобразить отдельное представление ошибки, если сообщение электронной почты не может быть отправлено, но мы хотели не усложнять наше первое MVC приложение.

ASP — Обработка сведений, введенных пользователем. Использование методов GET и POST

Последнее обновление: 31.10.2015

Методы действий (action methods) представляют такие методы контроллера, которые обрабатывают запросы по определенному URL. Например, возьмем проект из предыдущей главы. В нем был определен следующий контроллер:

Public > books = db.Books; ViewBag.Books = books; return View(); > public ActionResult Buy(int ; > >

Здесь методы Index и Buy являются методами действий или просто действиями контроллера. При получении запроса типа /Home/Index контроллер передает обработку запроса действию Index.

Так как запросы бывают разных типов, например, GET и POST, фреймворк ASP.NET MVC позволяет определить тип обрабатываемого запроса для действия, применив к нему соответствующий атрибут: , , или . Так, действие Buy разбито на два метода, по одному для каждого типа запроса.

Однако не все методы контроллера являются методами действий. Методы действий всегда имеют модификатор public . Закрытых приватных методов действий не бывает. Но контроллер может также включать и обычные методы, которые могут использоваться в вспомогательных целях. Например,

Соответственно мы не можем отправить из браузера запрос Home/getToday/ , потому что метод getToday не является методом действия.

Передача данных в контроллеры и параметры

В приложении из предыдущей главы метод Buy использовал параметр purchase. Так как данный метод обрабатывает POST-запросы, то мы можем отправить ему следующую форму:

Значение атрибута name у всех полей на этой форме соответствует названию свойства модели, поэтому система автоматически свяжет значения полей с соответствующими свойствами. А в методе Buy весь этот набор свойств превратится в модель Purchase.

Кроме POST-запросов у нас есть также GET-запросы, при которых все параметры передаются в строке запроса. Например, вторая версия метода Buy в качестве параметра принимает значение типа int: public ActionResult Buy(int >

Кроме того, система маршрутизации позволяет создавать маршруты. Например, по умолчанию в проекте MVC определяется следующий маршрут: Контроллер/Метод/id . Последний параметр является опциональным. И благодаря этому мы можем передать параметр id и так: Home/Buy/2

Для примера определим действие, которое будет подсчитывать площадь треугольника:

Public string Square(int a, int h) < double s = a*h/2.0; return "

В этом случае мы можем обратиться к действию, набрав в адресной строке Home/Square?a=10&h=3 , и приложение выдало бы нам нужный результат.

Мы также можем задать для параметров значения по умолчанию:

Public string Square(int a=10, int h=3) < double s = a*h/2.0; return "

Площадь треугольника с основанием » + a + » и высотой » + h + » равна » + s + «

В этом случае при запросе страницы мы можем указать только один параметр или вообще не указывать(Home/Square?h=5 ).

Получение данных из контекста запроса

Кроме того, мы можем получить параметры, да и не только параметры, но и другие данные, связанные с запросом, из объектов контекста запроса. Нам доступны следующие объекты контекста: Request , Response , RoutedData , HttpContext и Server .

Объект Request содержит коллекцию Params, которая хранит все параметры, переданные в запросы. И мы их можем получить:

Получение данных запроса в контроллере

Контроллеры часто нуждаются в доступе к данным из входящего запроса, таким как значения строки запроса, значения формы и параметры, извлеченные из URL системой маршрутизации. Существуют три основных способа доступа к таким данным:

извлечение данных из набора объектов контекста;

передача данных в качестве параметров методу действия;

явное обращение к средству привязки моделей инфраструктуры.

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

Получение данных из объектов контекста

Когда вы создаете контроллер путем его наследования от базового класса Controller, то получаете в свое распоряжение набор удобных свойств для доступа к информации, касающейся запроса. К таким свойствам относятся Request, Response, RouteData, HttpContext и Server. Каждое перечисленное свойство отвечает за конкретный аспект запроса. Мы называем их удобными свойствами, поскольку каждое из них извлекает определенный тип данных из экземпляра ControllerContext для запроса (который доступен через свойство Controller.ControllerContext).

Наиболее часто используемые объекты контекста и свойства описаны в таблице ниже:

Часто используемые объекты контекста ControllerContext и свойства

Переменные GET, отправленные с этим запросом

Переменные POST, отправленные с этим запросом

Cookie-наборы, отправленные браузером с этим запросом

Метод HTTP (команда наподобие GET или POST), используемый для этого запроса

Полный набор заголовков HTTP, отправленных с этим запросом

Элемент RouteTable.Routes, выбранный для этого запроса

IP-адрес пользователя, сделавшего этот запрос

Элемент Routetable.Routes, выбранный для этого запроса


Активные параметры маршрута (либо извлеченные из URL, либо стандартные значения)

Хранилище состояния приложения

Хранилище кеша приложения

Хранилище состояния для текущего запроса

Хранилище состояния для сеанса посетителя

Аутентификационная информация о вошедшем пользователе

Временные элементы данных, сохраненные для текущего пользователя

Отдельные свойства, которые здесь упоминались — Request, HttpContext и т.д. — предоставляют объекты контекста. Здесь они подробно не рассматриваются (поскольку являются частью платформы ASP.NET), но следует знать, что такие объекты предоставляют доступ к полезной информации и средствам, и более подробно вы можете прочитать о них в разделе, посвященном ASP.NET Web Forms .

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

Using System; using System.Web; using System.Web.Mvc; namespace ControllersAndActions.Controllers < public ]; // . return View(); >> >

Исследовать огромный диапазон доступной информации о контексте запроса можно с помощью средства IntelliSense (в методе действия наберите this. и просмотрите сведения во всплывающем окне) и сети Microsoft Developer Network (просмотрите документацию по классу System.Web.Mvc.Controller и его базовым свойствам или по классу System.Web.Mvc.ControllerContext).

Использование параметров метода действия

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

Его можно переписать так, чтобы в нем применялись параметры:

// . public ActionResult WeatherForecast(string city, DateTime forDate) < // реализовать прогноз погоды return View(); >// .

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

Полезно отметить, что методы действий не допускают применения параметров out или ref. Их использование не имеет никакого смысла; встретив такой параметр, MVC Framework сгенерирует исключение.

Инфраструктура MVC Framework предоставит значения для параметров метода действия, автоматически проверив объекты контекста и свойства, в том числе Request.QueryString, Request.Form и RouteData.Values. Имена параметров трактуются как нечувствительные к регистру символов, поэтому параметр метода действия по имени city может получить значение, например, из Request.Form[«City»].

Создание объектов параметров

Базовый класс Controller получает значения для параметров методов действий с использованием компонентов MVC Framework, называемых поставщиками значений и связывателями моделей . Поставщики значений представляют набор элементов данных, доступных контроллеру. Существуют встроенные поставщики значений, которые производят выборку элементов из Request.Form, Request.QueryString, Request.Files и RouteData.Values. Эти значения затем передаются связывателям моделей, которые пытаются отобразить их на типы параметров, принимаемых методами действий.

Стандартные связыватели моделей могут создавать и заполнять объекты любого типа.NET, включая коллекции и специальные типы, специфичные для проектов. Соответствующий пример приводился в статье Админ панель: редактирование товаров , в котором отправляемая администратором форма была представлена методу действия как одиночный объект Game, несмотря на то, что индивидуальные значения были разбросаны по элементам HTML-формы.

Обязательные и необязательные параметры

Если MVC Framework не может найти значение для параметра ссылочного типа (вроде string или object), метод действия по-прежнему вызывается, но для этого параметра используется значение null. Если не удается найти значение для параметра типа значения (такого как int или double), генерируется исключение и метод действия не вызывается. Сказанное можно интерпретировать и по-другому:

Параметры типа значения являются обязательными. Чтобы сделать их необязательными, необходимо либо задать стандартное значение (как показано в следующем разделе), либо указать для параметра тип, допускающий значения null (наподобие int? или DateTime?); последнее позволит MVC Framework передавать null, если значение не доступно.

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

Указание стандартных значений для параметров

Если вы хотите обрабатывать запросы, которые не содержат значений для параметров методов действий, но при этом не проверять значения на предмет равенства null и не генерировать исключения в коде, можете воспользоваться средством необязательных параметров языка C#. В примере ниже приведен пример:

// . public ActionResult WeatherForecast(DateTime forDate, string city = «Москва», int page = 1) < // реализовать прогноз погоды return View(); >// .

Чтобы пометить параметр как необязательный, необходимо при определении присвоить ему значение. В примере были предоставлены стандартные значения для параметров city и page. Инфраструктура MVC Framework попытается получить значения для этих параметров из запроса, но если окажется, что значения не доступны, будут использоваться стандартные значения.

Для параметра city типа string это означает, что проверка значения на предмет равенства null не понадобится. Если в обрабатываемом запросе значение для city не указано, методу действия для этого параметра будет передана строка «Москва». Что касается параметра типа int, то переживать о возможной ошибке, если значение для page не задано, не придется. Методу действия для этого параметра будет передано стандартное значение, равное 1.

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

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

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

Этот пост — ответ на вопрос, заданный в комментарии к одной из моих статей.

В статье я хочу рассказать, что же из себя представляют HTTP-методы GET/POST/PUT/DELETE и другие, для чего они были придуманы и как их использовать в соответствии с REST.

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

Стартовые строки для запроса и ответа имеют различный формат — нам интересна только стартовая строка запроса, которая выглядит так:

METHOD URI HTTP/VERSION ,

Где METHOD — это как раз метод HTTP-запроса, URI — идентификатор ресурса, VERSION — версия протокола (на данный момент актуальна версия 1.1).

Заголовки — это набор пар имя-значение, разделенных двоеточием. В заголовках передается различная служебная информация: кодировка сообщения, название и версия браузера, адрес, с которого пришел клиент (Referrer) и так далее.

Тело сообщения — это, собственно, передаваемые данные. В ответе передаваемыми данными, как правило, является html-страница, которую запросил браузер, а в запросе, например, в теле сообщения передается содержимое файлов, загружаемых на сервер. Но как правило, тело сообщения в запросе вообще отсутствует.

Пример HTTP-взаимодействия

Запрос:
GET /index.php HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Accept: text/html Connection: close
Первая строка — это строка запроса, остальные — заголовки; тело сообщения отсутствует

Ответ:
HTTP/1.0 200 OK Server: nginx/0.6.31 Content-Language: ru Content-Type: text/html; charset=utf-8 Content-Length: 1234 Connection: close . САМА HTML-СТРАНИЦА.

Ресурсы и методы

Тип HTTP-запроса (также называемый HTTP-метод) указывает серверу на то, какое действие мы хотим произвести с ресурсом. Изначально (в начале 90-х) предполагалось, что клиент может хотеть от ресурса только одно — получить его, однако сейчас по протоколу HTTP можно создавать посты, редактировать профиль, удалять сообщения и многое другое. И эти действия сложно объединить термином «получение».

Для разграничения действий с ресурсами на уровне HTTP-методов и были придуманы следующие варианты:

  • GET — получение ресурса
  • POST — создание ресурса
  • PUT — обновление ресурса
  • DELETE — удаление ресурса

Обратите внимание на тот факт, что спецификация HTTP не обязывает сервер понимать все методы (которых на самом деле гораздо больше, чем 4) — обязателен только GET, а также не указывает серверу, что он должен делать при получении запроса с тем или иным методом. А это значит, что сервер в ответ на запрос DELETE /index.php HTTP/1.1 не обязан удалять страницу index.php на сервере, так же как на запрос GET /index.php HTTP/1.1 не обязан возвращать вам страницу index.php, он может ее удалять, например:)

В игру вступает REST

REST предлагает отказаться от использования одинаковых URI для разных ресурсов (то есть адреса двух разных статей вроде /index.php?article_ >

REST дает программистам возможность писать стандартизованные и чуть более красивые веб-приложения, чем раньше. Используя REST, URI для добавления нового юзера будет не /user.php?action=create (метод GET/POST), а просто /user.php (метод строго POST).

В итоге, совместив имеющуюся спецификацию HTTP и REST-подход наконец-то обретают смысл различные HTTP-методы. GET — возвращает ресурс, POST — создает новый, PUT — обновляет существующий, DELETE — удаляет.

Проблемы?

PUT/DELETE запросы можно отправлять посредством XMLHttpRequest, посредством обращения к серверу «вручную» (скажем, через curl или даже через telnet), но нельзя сделать HTML-форму, отправляющую полноценный PUT/DELETE-запрос.

Дело в том, спецификация HTML не позволяет создавать формы, отправляющие данные иначе, чем через GET или POST. Поэтому для нормальной работы с другими методами приходится имитировать их искусственно. Например, в Rack (механизм, на базе которого Ruby взаимодействует с веб-сервером; с применением Rack сделаны Rails, Merb и другие Ruby-фреймворки) в форму можно добавить hidden-поле с именем «_method», а в качестве значения указать название метода (например, «PUT») — в этом случае будет отправлен POST-запрос, но Rack сможет сделать вид, что получил PUT, а не POST.

Я хочу использовать ASP для генерации кода в настольном приложении C#.

Для этого я создал простой хост (полученный из System.MarshalByRefObject), который обрабатывает System.Web.Hosting.SimpleWorkerRequest через HttpRuntime.ProcessRequest. Это обрабатывает сценарий ASPX, указанный входящим запросом (используя System.Net.HttpListener для ожидания запросов).

Клиентская часть представлена ​​System.ComponentModel.BackgroundWorker, которая строит System.Net.HttpWebRequest и получает ответ от сервера.

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

Private vo ); var postDataStream = request.GetRequestStream(); postDataStream.Write(postData, 0, postData.Length); // send request, wait for response and store/print content using (var response = (HttpWebResponse)request.GetResponse()) < using (var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) < _processsedContent = reader.ReadToEnd(); Debug.Print(_processsedContent); >> >

Мой сервер-часть-код выглядит следующим образом (без обработки исключений и т.д.):

Пока все это прекрасно работает, пока я просто использую параметры GET . Но когда дело доходит до получения POST-данных в моем сценарии ASPX, я сталкиваюсь с проблемами. Для тестирования я использую следующий сценарий:

// GET parameters are working: var getTest = Request.QueryString[«getTest»]; Response.Write(«getTest: » + getTest); // prints «getTest: 321» // don»t know how to access POST parameters: var postTest1 = Request.Form[«postTest»]; // Request.Form is empty?! Response.Write(«postTest1: » + postTest1); // so this prints «postTest1: » var postTest2 = Request.Params[«postTest»]; // Request.Params is empty?! Response.Write(«postTest2: » + postTest2); // so this prints «postTest2: «

кажется, что System.Web.HttpRequest объект, который я имею дело с в ASP не содержит никакой информации о моем параметре POST «посттестовый». Я проверил его в режиме отладки, и ни один из участников не содержал ни имени параметра «postTest», ни значения параметра «654». Я также попробовал метод BinaryRead Request, но, к сожалению, он пуст. Это соответствует Request.InputStream == null и Request.ContentLength == 0. И чтобы сделать вещи действительно запутывающими, член Request.HttpMethod установлен в «GET» ?!

Чтобы изолировать проблему, я проверил код, используя скрипт PHP вместо сценария ASPX. Это очень просто:

Print_r($_GET); // prints all GET variables print_r($_POST); // prints all POST variables

Array ( => 321) Array ( => 654)

Так со сценарием PHP это работает, я могу получить доступ к данным POST. Почему сценарий ASPX не работает? Что я делаю неправильно? Есть ли специальный объект или метод в объекте Response?

Может ли кто-нибудь дать подсказку или даже знать, как это решить? Заранее спасибо.

Методы GET и POST в HTTP и HTTPS — два самых популярных метода, используемых для передачи данных с клиента на сервер с использованием протокола HTTP (протокол передачи гипертекста). И GET, и POST могут использоваться для отправки запроса и получения ответа, но между ними существует значительная разница.

Разница между запросами GET и POST в HTTP или HTTPS — популярный вопрос на каждом интервью по веб-программированию. Поскольку HTML не зависит от технологии веб-сервера, такой как Java, ASP или PHP и HTTP — это основной протокол в пространстве Интернета, нельзя четко игнорировать важность понимания методов GET и POST. В этой статье мы рассмотрим, что такое HTTP-метод GET, что такое HTTP-метод POST, когда использовать тот или иной запрос и какова разница между ними. Разберем каждое понятие отдельно.

Что такое HTML?

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

Это пример абзаца в HTML.

Первая строка определяет тип содержимого, содержащегося в документе. , и , которые все включены в пример выше. Заголовок страницы, метаданные и ссылки на файлы с привязкой помещаются между Фактическое содержимое страницы находится между тегами .

За последние несколько десятилетий сеть пережила множество изменений, но HTML всегда был основным языком, используемым для разработки веб-страниц. Интересно, что хотя веб-сайты стали более продвинутыми и интерактивными, HTML стал проще. Если вы сравниваете источник страницы HTML5 с аналогичной страницей, написанной в HTML 4.01 или XHTML 1.0, на странице HTML5 будет меньше кода. Это связано с тем, что современный HTML опирается на каскадные таблицы стилей или JavaScript для форматирования почти всех элементов внутри страницы.

Многие динамические веб-сайты генерируют веб-страницы «на лету», используя серверный язык сценариев, такой как PHP или ASP. Однако даже динамические страницы должны быть отформатированы с использованием HTML. Поэтому языки сценариев часто генерируют HTML-код, который отправляется в веб-браузер.

Протокол передачи гипертекста HTTP предназначен для взаимодействия между клиентами и серверами и работает как протокол запроса-ответа.

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

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

Два метода запросов GET и POST

Два часто используемых метода для запроса-ответа между клиентом и сервером:

GET — запрашивает данные из указанного ресурса;

POST — отправляет данных, подлежащие обработке, на указанный ресурс.

Перевод GET и POST в буквальном смысле означает получение и постобработку.

Подробнее об HTTP

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

HTTP использует модель server-client. Клиент может быть домашним компьютером, ноутбуком или мобильным устройством. HTTP-сервер, как правило, является веб-хостом с программным обеспечением веб-сервера, таким как Apache или IIS. Когда пользователь получает доступ к веб-сайту, браузер отправляет запрос на соответствующий веб-сервер и отвечает кодом состояния HTTP. Если URL-адрес действителен и соединение предоставлено, сервер отправит браузеру веб-страницу и связанные файлы.

Общие коды состояния HTTP включают:

200 — успешный запрос (существует веб-страница);

301 — перемещается постоянно (часто перенаправляется на новый URL-адрес);

401 — несанкционированный запрос (требуется авторизация);

500 — внутренняя ошибка сервера (часто вызванная неправильной конфигурацией сервера).

POST и GET в HTTP

HTTP определяет команды GET и POST, которые используются для обработки представлений форм на веб-сайтах. Команда CONNECT используется для облегчения безопасного соединения, которое шифруется с использованием SSL. Зашифрованные HTTP-соединения происходят через HTTPS — расширение HTTP, предназначенное для защищенных передач данных.

URL-адреса, начинающиеся с «http://», доступны по стандартным протоколам передачи гипертекста и по умолчанию используют порт 80. URL-адреса, начинающиеся с «https://», доступны через безопасное соединение HTTPS и часто используют порт 443.

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


Операционные системы устройств Mac и Windows запускают POST каждый раз, когда компьютер загружается или перезапускается. Сканирование проверяет аппаратное обеспечение и гарантирует, что процессор, ОЗУ и устройства хранения данных будут работать правильно. Если во время выполнения POST возникла ошибка, процесс запуска может приостановиться или полностью прекратиться, а на мониторе может появиться сообщение о На ПК ошибки POST часто отображаются на экране информации о BIOS. Они могут выводиться как криптовые коды, такие как «08», или как системное сообщение, например, «Ошибка системной памяти при смещении». На Mac ошибки POST часто обозначаются простой графикой, например, сломанной иконкой папки, которая указывает, что загрузочное устройство не найдено.

Физические проявления

В некоторых случаях экран компьютера может даже не включаться перед ошибками POST. Если это произойдет, коды ошибок могут выводиться через мигающие светодиодные индикаторы или звуковые сигналы. Например, Apple iMac будет воспроизводить три последовательных тона, выдерживать паузу в пять секунд, а затем повторять тоны, когда во время запуска обнаруживается плохая ОЗУ. Большинство ПК также издают звуковые сигналы при обнаружении ошибок POST, хотя каждый производитель использует свои собственные коды.

POST — довольно технический термин, который используют только компьютерные техники на регулярной основе. Однако это хорошая аббревиатура, поскольку помогает лучше понять сообщения об ошибках, которые могут появиться на компьютерах или других электронных устройствах. Если компьютер не запускается из-за ошибки POST, можно использовать другое устройство для поиска значения и причины ошибки с веб-сайта производителя. Затем можно предпринять соответствующие действия — удаление модуля памяти или повторную установку видеокарты с последующим перезапуском оборудования.

POST также является методом передачи переменных формы HTML с одной веб-страницы на другую, не отображая их в адресной строке. Альтернативный метод — GET, который добавляет значения в URL. Запросы HTTP POST предоставляют дополнительные данные от клиента (браузера) на сервер в теле сообщения. Напротив, запросы GET включают все необходимые данные в URL. Формы в HTML могут использовать любой метод, указав метод = POST или method = GET (по умолчанию) в элементе . Указанный метод определяет, как данные формы передаются на сервер. Когда используется метод GET, все данные формы кодируются в URL-адрес в качестве параметров строки запроса. С POST данные формы появляются в теле сообщения HTTP-запроса.

Различия в представлении формы

Метод запроса POST запрашивает веб-сервер на прием и хранение данных, заключенные в тело сообщения запроса. Часто используется при загрузке файла или при отправке заполненной веб-формы.

Метод запроса HTTP GET извлекает информацию с сервера. В рамках запроса GET некоторые данные могут передаваться в строке запроса URL-адреса, указывая условия поиска, диапазоны дат или другую информацию, которая определяет запрос.

В рамках запроса POST произвольный объем данных любого типа может быть отправлен на сервер в теле сообщения запроса. Поле заголовка в запросе POST обычно указывает тип интернет-носителя тела сообщения.

Основное различие между запросами GET и POST заключается в том, что они соответствуют различным HTTP-запросам, как определено в спецификациях HTTP. Процесс подачи обоих методов начинается таким же образом: набор данных формы создается браузером и затем кодируется способом, указанным атрибутом enctype. Для METHOD = «POST атрибут enctype может быть multipart/form-data или application/x-www-form-urlencoded, тогда как для METHOD =» GET » запускается только через application/x-www-form-urlencoded. Эти данные формы set затем передается на сервер.

Для отправки формы с помощью METHOD = «GET» браузер создает URL-адрес, принимая значение атрибута действия и добавляя к нему набор данных формы, закодированного с использованием типа контента application/x-www-form-urlencoded). Затем браузер обрабатывает этот URL-адрес, как если бы он ссылался на ссылку (или, как если бы пользователь набрал URL-адрес вручную). Браузер делит URL на части и распознает хост, затем отправляет на этот хост запрос GET с остальной частью URL в качестве аргумента. Важно отметить, что этот процесс означает, что данные формы ограничены кодами ASCII. Особое внимание следует уделять кодированию и декодированию других типов символов при передаче их по URL-адресу в формате ASCII.

Представление формы с METHOD = «POST» вызывает отправку запроса POST с использованием значения атрибута действия и сообщения, созданного в соответствии с типом контента, указанным атрибутом enctype.

PHP — это встроенный в HTML. Это означает, что PHP-код можно вставить в HTML-страницу. Код PHP читается или анализируется сервером, на котором находится страница. Вывод функций GET и POST в PHP на странице обычно возвращается как HTML-код, который может быть прочитан браузером. Поскольку PHP-код преобразуется в HTML до загрузки страницы, пользователи не могут просматривать PHP-код на странице. Это делает страницы PHP достаточными для доступа к базам данных и другой защищенной информации.

Большая часть синтаксиса PHP заимствована из других языков, таких как C, Java и Perl. Однако PHP имеет ряд уникальных функций и специальных функций. Цель этого языка — дать возможность веб-разработчикам быстро и легко писать динамически сгенерированные страницы.

WordPress

WordPress — это бесплатная система управления контентом, используемая для создания и обслуживания веб-сайтов. Его простота использования и уникальные функции ведения блога помогли ему стать самым популярным инструментом ведения блогов в Интернете.

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

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

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

ASP — Обработка сведений, введенных пользователем. Методы действий и их параметры

Видя в кино совокупляющихся людей, мы иной раз отмечаем: надо же, как хорошо сыграли! Прямо хоть «Оскар» давай! О том, что секс может быть не симулирован, никто даже не задумывается — мы ведь знаем, какое огромное количество «посторонних зрителей» обычно присутствует на съемочной площадке, да и вообще, если все взаправду, то это уже по-другому называется и на полки обычных видеомагазинов не попадает. Но из каждого правила бывают исключения, и в редких случаях реальные соития все же проникают на большой экран. Мы вспомнили наиболее примечательные примеры из этого ряда.

Постер к фильму «Свит Свитбэк: Песня мерзавца»

Инди-режиссер Мелвин Ван Пиблз точно знал, что ему нужно, когда писал сценарий, снимал и монтировал фильм о злоключениях чернокожей секс-машины по имени Свит Свитбэк. Главному герою приходится нарушить множество существовавших в начале 70-х жанровых табу: убивать собак и полицейских, мочиться и, конечно, много заниматься сексом, в том числе межрасовым. Подписать на такое кого-то было непросто, и ни на каскадера, ни даже на дублера у Мелвина денег не имелось, потому режиссер сам исполнил главную роль, мужественно проведя перед камерой ряд половых актов с едва знакомыми людьми. Подтверждением того, что все было взаправду, стала подхваченная им в процессе съемок гонорея, на лечение которой Ван Пиблз даже умудрился выбить энную сумму из Гильдии кинорежиссеров — правда, в итоге и эти деньги ушли на производство картины. Результат, как оказалось, стоил того: «Песня мерзавца» стала одним из самых прибыльных и обсуждаемых фильмов 1971 года, попутно породив целый новый поджанр — «блэксплотейшн».

Постер к фильму «Розовые фламинго»

Фильм знаменитого кинопровокатора Джона Уотерса о девиантных развлечениях двух семеек слабоумных фриков строго не рекомендуется для просмотра любителям «клубнички»: ваши нервы могут не выдержать увиденного. Поскольку режиссер, по собственному признанию, добивался от аудитории не оваций, а рвотной реакции (на премьере зрителям даже раздавали гигиенические пакеты), то и методы у него соответствующие: секс с участием раздавленных кур, дефекация и мастурбация, поедание одним из персонажей собачьего дерьма, минет матери собственному сыну. То, что «мать» играл знаменитый трансвестит Дивайн (настоящее имя Харрис Глен Милстед), приятности картине не доставляет; прочем, при всей своей непотребности, сексуальная составляющая все же несколько меркнет на фоне какашек, которые Дивайн, согласно его интервью разных лет, то ли ел, то ли не ел. В итоге режиссер положил конец кривотолкам, ответственно заявив, что ввиду практически нулевого бюджета на реквизит и дублеров у него финансов не имелось. Так что все было «по-чесноку» (за исключениям разве что каннибализма), и несчастные куры, увы, тоже умерли по-настоящему.

Кадр из фильма «Разыскивающий»

Триллер Уильяма Фридкина о серийном убийце, расчленяющем геев, запомнился зрителям не только участием Аль Пачино , но и сценами однополого секса, запечатленного камерой в многочисленных гей-клубах. «Все было по-настоящему, — признавался позже режиссер “Изгоняющего дьявола ”, рассказывая, что изначально нью-йоркские геи, с которыми он заводил знакомства в спецбарах, помогли ему со сбором материала для ленты, а потом они же в ней и сыграли. — В моем фильме нет членов Гильдии актеров массовки. Мы заплатили этим ребятам как статистам, но на самом деле они просто тусовались в тех местах, где мы снимали, и делали вот это самое». Студии, профинансировавшие фильм, остались не в восторге от результата, которому светил порнографический рейтинг «Х», и заставили его чудовищно изрезать, оставив на полу монтажной большую часть «клубнички». Но лента все равно провалилась в прокате — считается, что именно она забила последний гвоздь в гроб эпохи Нового Голливуда, дававшей многим независимым режиссерам деньги на съемки фильмов «не для всех». Вырезанные сцены позже, к слову, были восстановлены Джеймсом Франко в документалке «Интерьер. Кожаный бар» — и правильно, не зря же Фридкин старался, в самом деле.

Постер к фильму «Империя чувств»

История японской проститутки 30-х годов, несмотря на шокирующую откровенность сопровождающих ее сексуальных сцен, даже в родной Японии стоившую ленте цензурных правок, а режиссеру Нагиса Осима — судебного обвинения, в целом все же не имела таких серьезных проблем с прокатом, как последующие образчики эротического жанра. Ей удалось заработать и культовый статус, подкрепленный несомненными художественными достоинствами, и овацию в Каннах. К 1990 году «Империя чувств» сумела проникнуть даже в советские кинотеатры (пусть и с грифом «детям до шестнадцати просмотр запрещен»), снеся неискушенным гражданам крышу демонстрацией фелляции и прочих недвусмысленных проникновений и вызвав в СМИ возмущение «актами подлинного совокупления без всякой вуали». Так советский человек понял: в СССР секса, может, и нет, но в Японии он точно есть. К слову, сцена кастрации, присутствующая в «Империи чувств», все же не была настоящей — даже для японских кинематографистов, не особенно обременяющих себя вопросами нравственности, это было бы слишком.

Постер к фильму «Калигула»

Те, кто не знаком с историей создания «Калигулы», удивляются, как это Тинто Брасс умудрился заманить в порнофильм таких актеров, как Малкольм МакДауэлл , Джон Гилгуд , Питер О’Тул , Хелен Миррен . Ларчик открывается просто: несмотря на репутацию Брасса, лента не задумывалась им как порнографическая — любитель небритых подмышек действительно планировал сделать историческое полотно о кровавом римском императоре, и весь снятый им секс был симулирован. Но после того, как спонсор, издатель порножурнала «Пентхаус» Боб Гуччионе, стал требовать «тру хардкора» (статус «взрослого кино» позволил бы увеличить цену кинобилетов), Брасс заартачился и был уволен, а Гуччионе сам сел в режиссерское кресло и доснял шесть минут чистой порнографии, которая была довольно грубо вмонтирована в уже готовое кино без предупреждения остальных участников проекта. Нужно ли говорить о том, как громко стукнулись об пол челюсти исполнителей главных ролей на премьере.

Постер к фильму «Кен Парк»

После скандальных, но все-таки не порнографических «Деток » о сексуальной жизни подростков режиссер Ларри Кларк не успокоился и снял «Кен Парк» — снова про подростков, — в котором заставил своих героев зайти на территорию куннилингуса, минета, мастурбации, группового секса и других сложно симулируемых вещей, показанных крупным планом. Учитывая достаточно юный возраст актеров, которым пришлось участвовать в действиях сексуального характера, фильм вызвал нешуточное бурление в прессе и был запрещен в ряде стран, в том числе в США. Аргументы режиссера, уверявшего, что всем участникам проекта уже исполнилось 18, то есть они с полным правом могут сниматься в любом хардкорном порно, мало что изменили в глазах большей части консервативного общества, рассудившего: может, конечно, подростки и занимаются сексом, но показывать это в кинотеатрах все-таки не надо. А то вдруг еще зрители что-то новое узнают…

Постер к фильму «Бурый кролик»

Никто бы сегодня не помнил этого фильма, если бы не Хлои Севиньи в главной женской роли, которую центральный актер и по совместительству режиссер ленты Винсент Галло (он же продюсер и автор сценария) уломал на крупноплановую фелляцию себе, любимому. В Каннах «Бурого кролика» так освистали, что Галло пообещал завязать с режиссурой, но, впрочем, слова не сдержал. Карьера Севиньи тоже предсказуемо хрустнула — следующие лет 10 ни одно ее интервью не обходилось без покаянных речей о том, что она напрасно доверилась чутью режиссера, обещавшего снять пронзительный фестивальный хит. Сегодня, в эпоху взлома айфонов, такими видео уже никого удивишь, но в начале нулевых подобные скандалы были еще в диковинку, так что девушке от общества здорово досталось. Тот факт, что по сюжету ее героиня была наркоманкой, да и вообще скандальный минет случился лишь в воспаленной фантазии персонажа Галло, мало что изменил: на пленке-то все было более чем реальным, в чем и поспешили убедиться полчища зрителей, следующие лет десять активно качавшие скандальную ленту из Сети лишь ради просмотра той самой сцены.

Постер к фильму «9 песен»

Есть мнение, что моду на фестивальные фильмы, в которых обилие секса прикрывает недостатки режиссуры и актерской игры, заложила музыкальная эротическая драма «9 песен» Майкла Уинтерботтома , содержание которой вкратце можно описать словами «ученый и студентка занимаются сексом, в промежутках — концертные номера». Несимулированные половые контакты между героями Кирана О»Брайена и Марго Стилли включали полный джентльменский набор: классический секс, оральный, эякуляция и прочие неприкрытые атрибуты порножанра. Актерам дали возможность «порепетировать» перед съемками (часть этого материала позже вошла в фильм), после чего они дали согласие на основные съемки, но, правда, когда камера была выключена, О’Брайен и Стилли нисколько друг другом не интересовались. Сношения, показанные в фильме, большинством критиков были признаны «неаппетитными», а сюжет — отсутствующим (у ленты и правда не было никакого сценария). Кроме того, британский парламент гневно осудил режиссера, решившего потроллить общественные вкусы сакраментальным вопросом «почему в кино нельзя показывать занятия любовью, ведь это так же естественно, как принимать пищу?», а фотомодель, сыгравшая главную роль, перед релизом попросила убрать ее имя из титров. Позже, правда, Марго перестала скрываться: какими бы слабыми во всех планах ни оказались «9 песен», для нее они стали стартом довольно успешной актерской карьеры.

Постер к фильму «Трахни меня»

Наивно думать, что реального секса от актеров могут требовать только режиссеры-мужчины. Криминальный триллер «Трахни меня», поставленный француженками Вирджини Депант и Корали Трин Ти , с самого начала планировался ими как гремучий сплав жанрового кино в духе «Прирожденных убийц » и «Тельмы и Луизы » со сценами жесткого порева (благо у второй постановщицы имелся большой опыт в этом плане, причем по обе стороны камеры). На роли главных героинь — проститутки Надин и порноактрисы Ману — были выбраны настоящие актрисы категории «икс», что позволило им правдиво отыграть порносцены, которыми нашпигована лента, да и с драматической составляющей справиться достаточно неплохо. Правда, сама история об озлобленных на мужчин девушках с трудным прошлым, которые в поисках мести трахают и убивают всех, кто им попадается на пути, была воспринята зрителем слишком жестокой и феминистичной, а героини получились по-настоящему отталкивающими. Как следствие, лента была запрещена к прокату в нескольких странах и имела проблемы с цензурой даже в либеральной Франции. Впрочем, было бы странно, если бы вышло как-то по-другому.

Постер к фильму «Необратимость»

Мы знаем, о чем вы сейчас подумали. Но нет, спешим разочаровать: знаменитая десятиминутная сцена анального изнасилования Моники Белуччи в подземном переходе, сделавшая карьеру молодому французскому режиссеру Гаспару Ноэ , является имитацией от первого до последнего кадра (как, к слову, и анальная пенетрация в «Последнем танго в Париже », раз уж зашла речь о знаменитых шоковых киномоментах). Зато в фильме есть другие несымитированные моменты, такие как фелляция и мастурбация. Ноэ и до и после увлекался порносценами — хардкорные моменты можно найти чуть ли не в каждом его фильме, начиная с полнометражного дебюта «Один против всех » и заканчивая короткометражками разных лет, а во «Входе в пустоту » он изощрился и вовсе показал половой акт изнутри, правда, то была уже фотореалистичная компьютерная анимация. К слову, эротическая сцена, в которой Белуччи занята с Венсаном Касселем , тоже снята «натурально», поскольку во время съемок актеры пребывали друг с другом в счастливом браке. Но в данном случае Ноэ пощадил чувства супругов и решил обойтись легкой эротикой.

Постер к фильму «Клуб «Shortbus»»

В своем ромкоме о нью-йоркском клубе любителей секса Джон Кэмерон Митчелл умудрился показать целый спектр «взрослых удовольствий» — от мастурбации и группового секса до, как бы это сказать покорректней, аутофелляции. О том, что все оргазмы в «Клубе Shortbus» настоящие, постановщик на премьере мог бы и не сообщать: все и так видно невооруженным глазом. «Я не считаю свой фильм порнографическим, — говорил он позже. — Так как порнография характеризуется отсутствием художественных задач, ее цель — возбудить. А я не думаю, что у кого-либо возникнет эрекция во время просмотра моего фильма». Порно или нет — на эту тему можно долго спорить, но подобную раскованность в кадре вряд ли могли себе позволить знаменитости, потому актеры набирались по объявлению: Митчелл отсмотрел пять сотен видеозаявок из разных стран, прежде чем нашел достаточно киногеничных храбрецов, готовых отбросить ложный стыд. Чтобы тем было проще раскрепоститься, на съемках откровенных сцен он и оператор работали обнаженными. Несмотря на то что фильм был снят красиво и действительно мог похвастать наличием довольно занимательного сюжета, консервативную общественность несколько ошарашил вываленный на нее калейдоскоп сексуальной разнузданности, так что исполнительница одной из главных ролей, канадская радиоведущая Ли Сук-Йин, после выхода «Клуба Shortbus» в прокат едва не лишилась работы. К счастью, Фрэнсису Форду Копполе лента понравилась, и его заступничество решило вопрос.

Постер к фильму «Романс Х»

Француженка Катрин Брейя еще в дебютной драме «Настоящая девчонка », запрещенной везде, где только можно, и провалявшейся более 20 лет на полке, показала, какие затейливые вещи может страдающая от скуки девушка-подросток творить со своей вагиной. В «Романсе Х» она решила проследить, на что готова женщина, с которой отказывается спать любимый мужчина. На помощь был призван знаменитый порноактер Рокко Сиффреди, помогший героине раскрепоститься до известных пределов — критики насчитали мастурбацию, минет, половой акт, эякуляцию и прочие кунштюки вроде садо-мазо; все это, как можно понять, без какой-либо цензуры, страха и упрека. Цензура началась позже, когда некоторые страны затруднились с определением возрастного рейтинга ленты, так что какой-то период времени зрителю предлагалось выбирать между несколькими версиями разной степени порезанности. В итоге оригинальная версия была показана в ночном телеэфире сразу в нескольких странах, и аудитория успокоилась: ну, Рокко Сиффреди немножко в кадре эякулирует, ну да… То есть ничего такого революционного. Было бы куда апокалиптичней, если бы он вместо своей обычной работы шекспировские монологи с придыханием читал.

Постер к фильму «Интим»

Он — бармен, она — театральная актриса. У них есть маленький секрет, о котором не стоит знать окружающим. Но чем дальше длится их тайная связь, тем меньше устраивают одинокого бармена правила игры… «Интим» Патриса Шеро зацепил глаз зрителя не сколько даже натуралистичностью показа встреч двух людей, у которых, кроме быстрого секса по средам, нет ничего общего, сколько отталкивающим характером этого натурализма: ни грима, ни косметики, добавьте к этому волосатые ноги, прыщи, неидеальность фигур, и вам вряд ли захочется пересматривать ленту, единственной целью которой, похоже, является раскрытие эстетики некрасивого. Впрочем, невзирая на все сюжетные провисания, крупноплановый минет в исполнении новозеландки Кэрри Фокс Уиллема Дефо с Шарлоттой Генсбур в «Антихристе» был вполне реальным. А Шиа ЛаБаф , голову которого, как клялся пресс-релиз «Нимфоманки», приклеили на компьютере к чужому совокупляющемуся торсу, после премьеры признался в интервью, что ничего такого на съемочной площадке не симулировал. В общем, можно спорить, кому конкретно принадлежали причиндалы, но как минимум то, что во все всех вышеперечисленных лентах возбужденные половые органы вступали в неиллюзорный контакт, сомнению не подлежит.

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

Я хочу использовать ASP для генерации кода в настольном приложении C#.

Для этого я создал простой хост (полученный из System.MarshalByRefObject), который обрабатывает System.Web.Hosting.SimpleWorkerRequest через HttpRuntime.ProcessRequest. Это обрабатывает сценарий ASPX, указанный входящим запросом (используя System.Net.HttpListener для ожидания запросов).

Клиентская часть представлена ​​System.ComponentModel.BackgroundWorker, которая строит System.Net.HttpWebRequest и получает ответ от сервера.

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

Private vo ); var postDataStream = request.GetRequestStream(); postDataStream.Write(postData, 0, postData.Length); // send request, wait for response and store/print content using (var response = (HttpWebResponse)request.GetResponse()) < using (var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) < _processsedContent = reader.ReadToEnd(); Debug.Print(_processsedContent); >> >

Мой сервер-часть-код выглядит следующим образом (без обработки исключений и т.д.):

Пока все это прекрасно работает, пока я просто использую параметры GET . Но когда дело доходит до получения POST-данных в моем сценарии ASPX, я сталкиваюсь с проблемами. Для тестирования я использую следующий сценарий:

// GET parameters are working: var getTest = Request.QueryString[«getTest»]; Response.Write(«getTest: » + getTest); // prints «getTest: 321» // don»t know how to access POST parameters: var postTest1 = Request.Form[«postTest»]; // Request.Form is empty?! Response.Write(«postTest1: » + postTest1); // so this prints «postTest1: » var postTest2 = Request.Params[«postTest»]; // Request.Params is empty?! Response.Write(«postTest2: » + postTest2); // so this prints «postTest2: «

кажется, что System.Web.HttpRequest объект, который я имею дело с в ASP не содержит никакой информации о моем параметре POST «посттестовый». Я проверил его в режиме отладки, и ни один из участников не содержал ни имени параметра «postTest», ни значения параметра «654». Я также попробовал метод BinaryRead Request, но, к сожалению, он пуст. Это соответствует Request.InputStream == null и Request.ContentLength == 0. И чтобы сделать вещи действительно запутывающими, член Request.HttpMethod установлен в «GET» ?!

Чтобы изолировать проблему, я проверил код, используя скрипт PHP вместо сценария ASPX. Это очень просто:

Print_r($_GET); // prints all GET variables print_r($_POST); // prints all POST variables

Array ( => 321) Array ( => 654)

Так со сценарием PHP это работает, я могу получить доступ к данным POST. Почему сценарий ASPX не работает? Что я делаю неправильно? Есть ли специальный объект или метод в объекте Response?

Может ли кто-нибудь дать подсказку или даже знать, как это решить? Заранее спасибо.

Применение методов GET и POST в PHP трудно переоценить, поскольку эти методы встречаются практически на каждом сайте. Прежде чем изучать ниже описанный материал, советую ознакомится с html тегом . Рассмотрим каждый из этих методов в подробности.

Метод GET

Метод GET использует для передачи данных строку URL. Возможно, Вы обращали внимание на длинные и непонятные URLы. Например: function.php?login=Alex&email=dezyakin . В данном случае данные обрабатываются в function.php. После знака вопроса «? » идет перечисление передаваемых параметров (параметр разделяются знаком «&») со значениями: параметру login присвоено значение Alex, а переменной email значение dezyakin. Данные будут хранится в суперглобальном массиве $_GET . Приведем пример использования метода GET представлен ниже:

указание метода GET Login : E-mail : С помощью суперглобального массива $_GET выводим принятые значения: */ echo «
login = «. $_GET[«login»] ; echo «
email = «. $_GET[«email»] ; ?>

Обратите внимание на то, как мы считываем значения из суперглобального массива $_GET: $_GET[«имя_переменной»] . В нашем примере имена переменных были объявлены в форме (name=login и name=email).

Совет :
Прежде чем обрабатывать полученные значения советую проверять их на существование через функции isset(имя_переменной) или empty(имя_переменной) — эти функции были рассмотрены в предыдущем уроке 2: переменные в PHP . Например:

проверка на существование с помощью isset: if isset ($_GET[«login»] ) < операторы для обработки login . >// или же проверить на существование с помощью empty: if empty ($_GET[«email»] ) < операторы для обработки email . >?>

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

В файле script.php должен содержатся какой-то обработчик информации, иначе информация будет передана в пустую.

Метод GET обладает множеством недостатков:

  • Пользователь видит значения передаваемых параметров;
  • Пользователь может легко подделать передаваемые параметры;
  • Неудобная передача бинарной информации (приходится кодировать в текстовый формат);
  • Объем передаваемых данных ограничен — 8 Кбайт;

Из-за выше перечисленных недостатков метод GET применяется только в тех случаях, когда нужно передать небольшой объем данных, а также эти данные никак не засекречены.

Метод POST

Метод POST отличается от GET тем, что данные передаются в закрытой форме. Существует суперглобальный массив $_POST , из которого можно считывать данные следующим образом: $_POST[«имя_переменной»] . Например:

Login : «> E-mail : «> С помощью суперглобального массива $_POST выводим принятые значения: */ echo «
login = «. $_POST[«login»] ; echo «
email = «. $_POST[«email»] ; ?>

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

Как видите URL не имеет никакой приписки, но тем не менее данные были получены и выведены.

Примечание :
1) Объем передаваемых значений методом POST по умолчанию ограничен и равен 8 Мбайт. Чтобы увеличить это значение нужно изменить директиву post_max_size в php.ini.

2) В ранних версиях PHP вместо коротких названий суперглобальных массивов $_GET и $_POST использовались более длинные имена: $HTTP_GET_VARS и $HTTP_POST_VARS . По умолчанию они выключены в php 5, но Вы можете их включить в конфигурационном файле php.ini с помощью параметра register_long_arrays . В php 6 версии эти длинные названия будут недоступны.

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

Получение данных запроса в контроллере

Контроллеры часто нуждаются в доступе к данным из входящего запроса, таким как значения строки запроса, значения формы и параметры, извлеченные из URL системой маршрутизации. Существуют три основных способа доступа к таким данным:

извлечение данных из набора объектов контекста;

передача данных в качестве параметров методу действия;

явное обращение к средству привязки моделей инфраструктуры.

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

Получение данных из объектов контекста

Когда вы создаете контроллер путем его наследования от базового класса Controller, то получаете в свое распоряжение набор удобных свойств для доступа к информации, касающейся запроса. К таким свойствам относятся Request, Response, RouteData, HttpContext и Server. Каждое перечисленное свойство отвечает за конкретный аспект запроса. Мы называем их удобными свойствами, поскольку каждое из них извлекает определенный тип данных из экземпляра ControllerContext для запроса (который доступен через свойство Controller.ControllerContext).

Наиболее часто используемые объекты контекста и свойства описаны в таблице ниже:

Свойство Тип Описание
Request.QueryString NameValueCollection
Request.Form NameValueCollection
Request.Cookies HttpCookieCollection
Request.HttpMethod string
Request.Headers NameValueCollection
Request.Url Uri
Request.UserHostAddress string
RouteData.Route RouteBase
RouteData.Values RouteValueDictionary
HttpContext.Application HttpApplicationStateBase
HttpContext.Cache Cache
HttpContext.Items IDictionary
HttpContext.Session HttpSessionStateBase
User IPrincipal
TempData TempDataDictionary
Часто используемые объекты контекста ControllerContext и свойства

Переменные GET, отправленные с этим запросом

Переменные POST, отправленные с этим запросом

Cookie-наборы, отправленные браузером с этим запросом

Метод HTTP (команда наподобие GET или POST), используемый для этого запроса

Полный набор заголовков HTTP, отправленных с этим запросом

Элемент RouteTable.Routes, выбранный для этого запроса


IP-адрес пользователя, сделавшего этот запрос

Элемент Routetable.Routes, выбранный для этого запроса

Активные параметры маршрута (либо извлеченные из URL, либо стандартные значения)

Хранилище состояния приложения

Хранилище кеша приложения

Хранилище состояния для текущего запроса

Хранилище состояния для сеанса посетителя

Аутентификационная информация о вошедшем пользователе

Временные элементы данных, сохраненные для текущего пользователя

Отдельные свойства, которые здесь упоминались — Request, HttpContext и т.д. — предоставляют объекты контекста. Здесь они подробно не рассматриваются (поскольку являются частью платформы ASP.NET), но следует знать, что такие объекты предоставляют доступ к полезной информации и средствам, и более подробно вы можете прочитать о них в разделе, посвященном ASP.NET Web Forms .

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

Using System; using System.Web; using System.Web.Mvc; namespace ControllersAndActions.Controllers < public ]; // . return View(); >> >

Исследовать огромный диапазон доступной информации о контексте запроса можно с помощью средства IntelliSense (в методе действия наберите this. и просмотрите сведения во всплывающем окне) и сети Microsoft Developer Network (просмотрите документацию по классу System.Web.Mvc.Controller и его базовым свойствам или по классу System.Web.Mvc.ControllerContext).

Использование параметров метода действия

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

Его можно переписать так, чтобы в нем применялись параметры:

// . public ActionResult WeatherForecast(string city, DateTime forDate) < // реализовать прогноз погоды return View(); >// .

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

Полезно отметить, что методы действий не допускают применения параметров out или ref. Их использование не имеет никакого смысла; встретив такой параметр, MVC Framework сгенерирует исключение.

Инфраструктура MVC Framework предоставит значения для параметров метода действия, автоматически проверив объекты контекста и свойства, в том числе Request.QueryString, Request.Form и RouteData.Values. Имена параметров трактуются как нечувствительные к регистру символов, поэтому параметр метода действия по имени city может получить значение, например, из Request.Form[«City»].

Создание объектов параметров

Базовый класс Controller получает значения для параметров методов действий с использованием компонентов MVC Framework, называемых поставщиками значений и связывателями моделей . Поставщики значений представляют набор элементов данных, доступных контроллеру. Существуют встроенные поставщики значений, которые производят выборку элементов из Request.Form, Request.QueryString, Request.Files и RouteData.Values. Эти значения затем передаются связывателям моделей, которые пытаются отобразить их на типы параметров, принимаемых методами действий.

Стандартные связыватели моделей могут создавать и заполнять объекты любого типа.NET, включая коллекции и специальные типы, специфичные для проектов. Соответствующий пример приводился в статье Админ панель: редактирование товаров , в котором отправляемая администратором форма была представлена методу действия как одиночный объект Game, несмотря на то, что индивидуальные значения были разбросаны по элементам HTML-формы.

Обязательные и необязательные параметры

Если MVC Framework не может найти значение для параметра ссылочного типа (вроде string или object), метод действия по-прежнему вызывается, но для этого параметра используется значение null. Если не удается найти значение для параметра типа значения (такого как int или double), генерируется исключение и метод действия не вызывается. Сказанное можно интерпретировать и по-другому:

Параметры типа значения являются обязательными. Чтобы сделать их необязательными, необходимо либо задать стандартное значение (как показано в следующем разделе), либо указать для параметра тип, допускающий значения null (наподобие int? или DateTime?); последнее позволит MVC Framework передавать null, если значение не доступно.

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

Указание стандартных значений для параметров

Если вы хотите обрабатывать запросы, которые не содержат значений для параметров методов действий, но при этом не проверять значения на предмет равенства null и не генерировать исключения в коде, можете воспользоваться средством необязательных параметров языка C#. В примере ниже приведен пример:

// . public ActionResult WeatherForecast(DateTime forDate, string city = «Москва», int page = 1) < // реализовать прогноз погоды return View(); >// .

Чтобы пометить параметр как необязательный, необходимо при определении присвоить ему значение. В примере были предоставлены стандартные значения для параметров city и page. Инфраструктура MVC Framework попытается получить значения для этих параметров из запроса, но если окажется, что значения не доступны, будут использоваться стандартные значения.

Для параметра city типа string это означает, что проверка значения на предмет равенства null не понадобится. Если в обрабатываемом запросе значение для city не указано, методу действия для этого параметра будет передана строка «Москва». Что касается параметра типа int, то переживать о возможной ошибке, если значение для page не задано, не придется. Методу действия для этого параметра будет передано стандартное значение, равное 1.

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

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

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

Свойство Тип Описание
Request.QueryString NameValueCollection
Request.Form NameValueCollection
Request.Cookies HttpCookieCollection
Request.HttpMethod string
Request.Headers NameValueCollection
Request.Url Uri
Request.UserHostAddress string
RouteData.Route RouteBase
RouteData.Values RouteValueDictionary
HttpContext.Application HttpApplicationStateBase
HttpContext.Cache Cache
HttpContext.Items IDictionary
HttpContext.Session HttpSessionStateBase
User IPrincipal
TempData TempDataDictionary

Кража обычного мобильного телефона не позволяет рассчитывать на его.

Каждый из нас хоть раз в жизни сталкивался с надоедливой надписью.

Asp обработка сведений, введенных пользователем

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

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

С уважением,
команда разработчиков eManual.ru

Азы ADO и ASP

Статьи по теме:
FileArea.co.il Азы ADO и ASP
Азы ADO и ASP Майкл Оути
Листинг 1. Применение объекта ADO Соединение
Листинг 2. Использование объекта ADO Набор записей
Листинг 3. Применение объекта ADO Набор записей для вставки строк
Листинг 4. Обработка ошибок ASP и ADO Основы интерактивного WEB-дизайна

Программный продукт ASP, название которого в переводе означает Активные страницы сервера (Active Server Pages), обеспечивает написание сценариев серверной части для информационных WEB-серверов компании Microsoft, IIS (Internet Information Server). Впервые корпорация Microsoft ввела ASP в версии IIS 3.0, и продолжила дальнейшую разработку этого продукта в IIS 4.0. ASP представляет собой гибкое динамичное средство создания WEB-страниц и позволяет применять любой язык написания сценариев, удовлетворяющий стандарту ActiveX. Как правило, ASP использует комбинацию из HTML и встроенного VBScript. IIS включает в себя сервер автоматизации OLE, который исполняет VBScript и посылает результаты реализации сценария в формате HTML клиенту, который может иметь только браузер. Так как сценарии ASP выполняются на сервере, то ASP способен работать с любым WEB-браузером, поскольку браузер получает лишь поток страниц HTML. Понимание того, каким образом объекты ADO работают с ASP, и в особенности того, как лучше применять объекты ADO для поиска и модификации данных, может превратить создание динамических WEB-страниц в легкое и приятное занятие.

Как работает ASP

Рисунок 1. Обзор взаимодействия ASP и HTML
1- WEB-сервер
2- Клиент WEB
3- Активный сценарий
4- пример .ASP

На рисунке 1 изображено, как ASP комбинирует сценарий ActiveX и команды HTML для того, чтобы получить динамическую страницу HTML. Как следует из рисунка, сценарии ASP отличаются от сценариев, базирующихся на браузерах. В традиционных сценариях, основывающихся на браузерах, WEB-сервер посылает страницу HTML, содержащую сценарий ActiveX в браузер клиента, который и отвечает за выполнение сценария. Подход, при котором основной акцент делается на клиентской части приложения, возлагает на нее дополнительный груз обязанностей, что может привести к возникновению проблем, если клиентский браузер не будет в состоянии выполнить сценарий. Напротив, страницы ASP исполняются на WEB-сервере IIS. В ходе исполнения страницы сервер напрямую посылает клиенту команды HTML и все клиентские сценарии, содержащиеся на странице ASP. Но как только сервер доходит до команды серверного сценария ASP, то он исполняет этот сценарий и передает клиенту в форме HTML только полученные в качестве результата выходные данные. Клиент, действия которого сводятся к использованию браузера, не видит разницы между потоком страниц HTML, порождаемым сценарием ASP, и потоком HTML, посылаемым статичными WEB-страницами. Таким образом, написание сценариев для серверной стороны с помощью ASP создает WEB-страницы, которые выступают в качестве исполнителей сценариев. Тот факт, что ASP генерирует только поток страниц HTML, обеспечивает независимость от типа браузера клиента. В силу того, что сервер IIS интерпретирует страницы ASP «на лету», ASP служит идеальным средством для встраивания результатов обработки интерактивных запросов к базе данных в WEB-страницы. Эти возможности обеспечиваются доступом к базе данных SQL Server через ADO непосредственно со страниц ASP.

Будь то доступ из Internet или из местной сети Intranet, клиенты применяют протоколы HTTP и TCP/IP для связи с WEB- сервером IIS. Когда WEB-клиент запрашивает страницу ASP, WEB-сервер IIS сценарии, находящиеся на этой странице. Для того чтобы получить доступ к базе данных SQL Server, сценарий ASP открывает соединение с SQL Server с помощью одного из объектов Соединение, Команда или Набор записей. Затем использует этот объект для передачи в сервер запроса на доступ к данным. SQL Server может размещаться на том же компьютере, что и WEB-сервер IIS. Однако в силу того, что часто SQL Server используется одновременно сразу несколькими различными приложениями, удобнее разместить его на отдельном компьютере, и обеспечить связь с ним через локальную сеть. После того как ядро SQL Server закончит обработку запроса, оно возвращает результаты объекту ADO из сценария ASP. Затем IIS продолжает исполнять сценарий ASP и отсылает поток страниц HTML обратно клиенту. Поэтому обязательно должно существовать сетевое соединение между WEB-сервером IIS и сервером баз данных SQL Server. Кроме того, на WEB-сервере необходимо установить поставщик OLE DB и библиотеки DLL на период прогона ADO.

Использование объектов ADO на страницах ASP

При использовании ADO приложение первым делом пытается применить объекты Соединение, Команда или Набор записей для установления соединения с SQL Server. Объект Соединение следует употреблять для того, чтобы открыть соединение ADO явным образом. Объекты Команда и Набор записей позволяют сделать то же самое динамически. После установления соединения приложение ASP может выполнять команды ADO такого же типа, что и стандартное приложение, написанное на Visual Basic (VB). Эти команды включают исполнение хранимых процедур, открытие и просмотр набора записей, вставку, обновление и удаление данных.

Для подключения страницы ASP к серверу баз данных SQL Server ADO может применять поставщик OLE DB как для ODBC, так и для SQL Server. Поставщик OLE DB для ODBC позволяет использовать структуру объекта ADO с большинством существующих драйверов ODBC. Но поставщик OLE DB для SQL Server дает возможность подключиться только к SQL Server. Однако с объектами ADO Соединение, Команда и Набор записей возможно применять любой из упомянутых поставщиков. Листинг 1 (написанный на языке VBScript) показывает, как применить поставщик OLE DB для ODBC в целях установления соединения с SQL Server.

Первое действие, проводимое в листинге 1, это объявление трех переменных, которые будут содержать имя компьютера, на котором размещен SQL Server, и информации для аутентификации SQL Server. Затем сценарий декларирует переменную cn, которую он в последствии будет использовать для объекта ADO Соединение. После объявления в сценарии рабочих переменных метод Формировать (Form) объекта ASP Запрос (Request) присваивает значения всем этим переменным.

Следующим шагом метод Создать объект (CreateObject) объекта ASP Сервер (Server) создает новый объект ADO Соединение (Connection), который затем присваивается введенной ранее переменной cn. Метод Создать объект (CreateObject) способен порождать экземпляры объектов СОМ. Данный пример иллюстрирует создание экземпляра объекта Соединение ADODB (ADODB.Connection), но его можно аналогичным образом применять и для других структур объектов СОМ, например, для SQL-DMO или Active Directory. (Более подробную информацию об объектах ASP можно найти во врезке «Модель объектов ASP»).

После этого сценарий присваивает значение строки соединения OLE DB свойству Строка соединения (ConnectionString) объекта Соединение, хранящегося в переменной cn. Это позволяет установить соединение без указания имени источника данных, DSN (Data Source Name). В силу того, что спецификация поставщика OLE DB проводилась без ключевого слова PROVIDER, по умолчанию берется поставщик OLE DB для ODBC. Ключевое слово DRIVER идентифицирует тот драйвер, который предполагается применять в дальнейшем. За ключевым словом SERVER указывается имя компьютера, содержащего SQL Server, с которым намереваются установить соединение. За ключевыми словами UID и PWD содержится информация, необходимая для входа в систему. Ключевое слово DATABASE определяет, что в роли базы данных, используемой по умолчанию, будет выступать база данных pubs. После того как будет присвоено значение строки соединения свойству Строка соединения (ConnectionString) объекта Соединение (Connection), его метод Открыть (Open) установит соединение с SQL Server, удовлетворяющее всем значением параметров, заданных в сценарии.

Поиск данных с помощью объекта ADO Набор записей ()

ADO можно применять для поиска данных с помощью объектов Набор записей (Recordset) или Команда (Command). Оба эти объекта способны работать с активным объектом Соединение (Connection), или же создавать новое отдельное соединение. Каждый раз, когда объект Соединение (Connection) или Набор записей (Recordset) устанавливает соединение, начинается новая коммуникационная сессия с SQL Server. Поэтому в том случае, если приложению необходимо выполнить несколько операций, целесообразнее применить объект Соединение (Connection) для открытия связи с SQL Server. Этот объект будет использоваться объектами Команда (Command) или Набор записей (Recordset).

Листинг 2 демонстрирует применение объекта ADO Набор записей (Recordset) на странице ASP. Первая часть сценария во многом напоминает простой пример установления соединения, приведенный в листинге 1. В сценарии сначала декларируются рабочие переменные, а затем им присваиваются значения. После этого по сценарию создается объект Соединение (Connection), и вслед за ним объект ADO Набор записей (Recordset). На следующем шаге сценария строка соединения присваивается объекту ADO Соединение (Connection), и затем для установления связи с SQL Server вызывается метод Открыть (Open). В соответствии со сценарием свойству Активное соединение (ActiveConnection) объекта Набор записей (Recordset), хранящегося в переменной rs, передается значение объекта активного соединения, cn, и выполняется метод Открыть (Open) объекта Набор записей (Recordset). Первый параметр метода Открыть (Open) содержит простой оператор SQL, который выбирает все столбцы и строки из таблицы stores базы данных Pubs.

После того как сценарий возвращает результаты обработки запроса, страница ASP создает таблицу HTML, содержащую шесть столбцов. После этого по сценарию столбцы получают заголовки. Сценарий использует стандарт HTML для построения всех заголовков столбцов. Внутри тела таблицы HTML в соответствии с меткой А листинга 2 программный код VBScript организует цикл Do Until. Этот цикл обрабатывает содержимое объекта Набор записей (Recordset), находящегося в переменной rs. Когда сценарий доходит до конца объекта Набор записей (Recordset), свойство rs.EOF получает значение Истина, и цикл завершается.

Встроенный в страницу ASP сценарий присваивает значения всем столбцам исходя из имени столбца объекта ADO Набор записей (Recordset). В рассматриваемом примере имя столбца, происходящее из таблицы Stores базы данных Pubs идентифицирует каждый пункт коллекции Поля (Fields). Расположенная вслед за этим часть кода VBScript реализует метод MoveNext для перехода к следующей строке в объекте Набор записей (Recordset). Затем оператор Цикл (Loop) возвращает управление в начало цикла Do Until. Когда этот цикл прочитает последнюю строку набора записей, цикл заканчивается и объекты Набор записей (Recordset) и Соединение (Connection), хранившиеся соответственно в переменных rs и cn, закрываются. Результаты работы этой страницы ASP можно видеть на экране 1.

Экран 1. Просмотр простого объекта ADO Набор записей
Изменение данных средствами ADO

ASP и ADO можно применять не только для динамической выдачи WEB-страниц, но и в целях создания WEB-страниц для ввода данных. Такая возможность позволяет создавать основанные на WEB приложения с использованием баз данных, обладающие таким же набором функций работы с базами данных, что и стандартные приложения, разработанные в соответствии с архитектурой клиент-сервер. Объекты ADO Набор записей (Recordset), которые становятся доступными на страницах ASP, предоставляют тот же перечень услуг, что и приложения, написанные на Visual Basic. Как показывает следующий пример, их можно применять для ввода данных. Кроме того, их можно использовать для изменения или удаления данных. Все остальные возможности ADO, такие как способность запускать подготовленные заранее операторы SQL или хранимые процедуры, также имеют место.

В целях внесения изменений в данные возможности, предоставляемые ASP и ADO, можно комбинировать различными способами. К примеру, можно было бы создать страницы ASP, которые будут поддерживать изменяемые объекты ADO Набор записей (Recordset). Они, в свою очередь, смогут применять методы Добавить новый (AddNew), Обновить (Update) и Удалить (Delete) для модификации данных в базах SQL Server. Помимо этого, возможно применять ADO для выполнения как динамических,, так и подготовленных заранее с помощью языка SQL операций модификации данных. Код приведенный на листинге 3, иллюстрирует, каким образом можно было бы добавлять строки в объект Набор записей (Recordset), который создается с использованием курсора Keyset.

Листинг 3 представляет дополнительные технические приемы построения WEB-приложений с помощью ASP. Первая строка является оператором VBScript Option Explicit, который указывает, что все переменные в коде VBScript перед их применением будут явным образом продекларированы. Как и в стандартном Visual Basic, в VBScript предусмотрено автоматическое использование новых переменных, без их предварительного объявления. На первый взгляд это свойство может показаться очень удобным, но в реальности оно служит довольно эффективным способом ввести в разрабатываемое приложение ASP множество трудно находимых коварных ошибок.

Следующим шагом оператором #include вводится файл adovbs.inc. Оператор #include представляет очень удобный путь копирования обычно употребляемых констант на страницы ASP. В данном случае файл adovbs.inc включает все константы, которые обычно содержит структура объекта ADO. Подключение этого файла дает возможность записывать константы в виде adChar и adKeyset, а не в виде значений, представляемых этими константами. Применение констант делает код удобно читаемым и легким в сопровождении. Хотя включение файла является хорошим приемом для средств разработки вообще, но в случае, когда для создания ASP- приложений используется такой инструмент, как Visual InterDev (VID), можно просто добавить в среду разработки VID ссылку на объектную библиотеку ADO. Подобное добавление устраняет необходимость включения файла в ASP- приложения. Чтобы добавить ссылку на ADO в проект VID следует выбрать в меню Проект (Project) и Ссылки проекта (Project References), а затем выбрать в списке доступных ссылок библиотеку Microsoft ActiveX Data Library 2.0.

В соответствии со сценарием VBScript, приведенным на листинге 3, сначала уничтожается, а затем воссоздается заново таблица в базе данных pubs, после чего в эту таблицу вставляются 50 строк и полученное содержимое показывается на WEB-странице. Но прежде чем выполнить все это, в том месте сценария, которое отмечено в листинге 3 буквой А, инициируется обработчик ошибок VBScript. В этом примере оператор On Error применен для того, чтобы обойти любые ошибки, которые могут произойти, к примеру, при попытке удалить несуществующую таблицу из указанной базы данных. В следующем разделе будет более подробно рассмотрено использование обработчика ошибок.

На следующем шаге сценарий ставит в соответствие переменной cn объект ADO Соединение (Connection). Затем метод Исполнить (Execute) объекта Соединение (Connection) выполняет два динамических оператора SQL. Первый уничтожает таблицу Department, а второй создает таблицу Department заново. После создания таблицы Department сценарий устанавливает в свойстве Активное соединение (ActiveConnection) объекта Набор записей (Recordset), указанного в переменной rs, ссылку на этот объект Соединение (Connection). Затем метод Открыть (Open) объекта Набор записей (Recordset) создает обновляемый набор записей. Константа adOpenKeyset определяет, что этот объект будет относиться к обновляемому типу Keyset, а константа adLockOptimistic предписывает использование оптимистического типа блокировки записей.

Цикл For Next вставляет 50 строк в таблицу Department. В этом цикле метод Добавить новый элемент (AddNew) создает буфер для хранения новой строки, после чего цикл присваивает значения объектам ADO Поле (Field). Каждый объект коллекции Поле (Field) идентифицируется по названию столбца. Значение счетчика цикла присваивается столбцу Dep_Id, содержащему идентификатор отдела, а в столбец Dep_Name с названием отдела помещается литерал Department и представленный в виде символьной строки номер отдела, равный значению счетчика цикла. Цикл вставляет новую строку в базовую таблицу в ходе исполнения метода Обновить (Update) объекта Набор записей (Recordset).

После того как сценарий вставит 50 строк в таблицу Department, метод Перейти к первой () перемещает курсор в начало объекта Набор записей (Recordset). Затем содержимое объекта Набор записей (Recordset) представляется в виде таблицы HTML, применяя ту же технику, что и в описанном ранее примере с запросом. На экране 2 показана WEB- страница, которая создается при запуске данной страницы ASP.

Экран 2. Просмотр записей, введенных на страницу ASP
Обработка ошибок ASP и ADO

Очень важно перехватывать ошибки, возникающие во время работы приложения: если вдруг в результате некорректного функционирования WEB-приложения системой будет сгенерировано сообщение об ошибке, то работа WEB- приложения будет немедленно прекращена. Для того чтобы предусмотреть на странице ASP специальную часть сценария VBScript, отвечающую за обработку возникающих ошибок, применяется оператор On Error. К сожалению, оператор On Error не обладает всей полнотой возможностей обработчика ошибок VB, который позволяет перейти в отдельную секцию кода для обработки информации об ошибке. Оператор On Error, входящий в VBScript, предоставляет только следующую альтернативу: либо перейти к следующей операции (Resume Next), либо вообще отключить обработку ошибок. Этот оператор не дает возможности перейти к другим секциям кода. Оператор On Error использует структуру объекта ADO для того, чтобы поместить ошибки, возникающие во время выполнения WEB-приложения на базе страниц ASP, в коллекцию объекта ADO Ошибка (Error). Коллекцию ошибок ADO можно обрабатывать с целью сбора дополнительной информации о том, какие ошибки встречаются при эксплуатации вашего приложения. Фрагмент кода, приведенный на листинге 4, показывает, как использовать обработчик ошибок VBScript и каким образом извлекать информацию из объекта ADO Ошибка (Error).

Обработку ошибок в листинге 4 обеспечивает оператор On Error. Затем для создания локального объекта ADO Соединение (Connection) по сценарию используется объект Соединение (Connection), который хранился в объекте ASP Сессия (Session). После этого в сценарии используется метод Выполнить (Execute) объекта ADO Команда (Command) применительно к заведомо неправильному имени таблицы. Поскольку обработка ошибок разрешена, программа переходит к следующему оператору.

Проверка свойства Счетчик (Count) коллекции объектов Ошибка (Error) позволяет найти ошибки ADO. Если значение счетчика больше нуля, значит, объект ADO столкнулся с какой- либо ошибкой во время исполнения. Извлечь информацию об ошибках ADO можно путем итеративного просмотра коллекции объектов Ошибка (Error). Пример на листинге 4 использует цикл For Each для обработки элементов коллекции ошибок объекта ADO Соединение (Connection). Свойства Номер(), Источник () и Описание () становятся доступными в форме текстов HTML. Экран 3 представляет страницу с результатами обработки ошибок. (Обратите внимание на то, что рассмотренный пример является не более чем демонстрацией подхода. В реальном приложении необходимо обрабатывать условия возникновения ошибок в коде приложения. При этом следует избегать вывода ошибок на браузер конечного пользователя).

Экран 3. Обработка ошибок ASP с помощью ADO

В том случае, когда на WEB-страницу должны выводиться только статичные данные, целесообразно применять Мастер WEB-приложений (), входящий в состав SQL Server. Он поможет легко и быстро преобразовать информацию базы данных SQL Server к виду WEB-страницы формата HTML. Если же необходимо создать по-настоящему интерактивное приложение, способное динамически представлять и обновлять данные, лучше всего применять комбинацию ASP и ADO, что позволит подключить вашу базу данных SQL Server к сети WEB. Использование ADO и ASP дает возможность создавать WEB-приложения, обладающие теми же функциями, что и их предшественники, выполненные в соответствии с традиционной архитектурой клиент-сервер.

В основу этой статьи лег адаптированный материал из книги Майкла Оути и Поля Конте «Руководство по разработке для SQL Server 7.0».

Майк Оути (mikeo@teca.com) работает старшим техническим редактором в журналах SQL Server Magazine и Windows NT и является президентом компании ТЕСА. Эта компания занимается разработкой программного обеспечения и консалтингом; находится в Портленде, штат Орегон.

Модель объектов ASP

Информационный сервер Интернет, IIS (Internet Information Server), разработанный корпорацией Microsoft, вводит Активные серверные страницы, ASP (Active Server Pages), в качестве автоматического сервера OLE, обладающего иерархической структурой объекта. На рисунке А представлена модель объекта ASP. Первичным объектом в программной модели ASP является объект Контекст сценария (ScriptingContext), который обеспечивает взаимодействие с браузером клиента. Поскольку объект Контекст сценария (ScriptingContext) всегда доступен приложениям ASP, то нет необходимости в явном виде делать на него ссылку. Объект Контекст сценария (ScriptingContext) содержит шесть основных объектов ASP: пять встроенных объектов и объект Контекст объекта (ObjectContext). К пяти встроенным объектам относятся: объект Приложение (Application), объект Запрос (Request), объект Сервер (Server), объект Сессия (Session) и объект Отклик (Response).

Все активные WEB-сессии применяют объект Приложение (Application) для того, чтобы все пользователи могли одновременно обращаться к информации приложения ASP. Объект Приложение (Application) включает две коллекции: Содержание (Context) и Статические объекты (StaticObjects). Каждый объект Содержание (Context) соответствует какому- либо пункту, для включения которого в WEB-приложение были использованы команды ActiveX. Коллекция Статические объекты (StaticObjects) содержит все объекты, для включения которых в WEB-приложение применялись ярлыки HTML . Кроме того, объект Приложение (Application) может также содержать определяемые пользователем объекты, которые были созданы этим WEB-приложением и предназначены для коллективного применения.

Объект Запрос (Request) получает запросы от клиентов сети WEB. Объект Запрос (Request) может вместить всю информацию содержащуюся в форме, плюс сведения о текущем пользователе. Этот объект включает несколько коллекций, каждая из которых представляет различные информационные наборы, которые могут возвращаться клиентам WEB в ответ на их запросы. Каждый объект Сертификат клиента (ClientCertificate) в одноименной коллекции представляет поле сертификата, которое возвращает клиент сети WEB и которое в дальнейшем служит его идентификатором. Коллекция (Cookies) состоит из элементов, каждый из которых содержит немного информации о пользователе WEB. Коллекция Формы (Forms) включает набор объектов, каждый из которых представляет какую-нибудь форму HTML. Коллекция Строка запроса (QueryString) содержит набор добавляемых аргументов URL, а коллекция Переменные сервера (ServerVariables) представляет собой набор переменных, описывающих серверное окружение.

Объект Сервер (Server) применяется для создания объектов OLE, которые было бы желательно иметь в WEB-приложении. Например, метод Создать объект (CreateObject) объекта Сервер (Server) генерирует объекты Соединение (Connection) и Набор записей (Recordset), обеспечивающих доступ к базам данных SQL Server.

Объект Сессия (Session) поддерживает информацию, относящуюся к текущей сессии в сети WEB. Объект Сессия (Session) во многом похож на объект Приложение (Application), но имеет отличие от него. В то время как объект Приложение (Application) принадлежит всем пользователям сети WEB, объект Сессия (Session) относится только к текущей сессии. Коллекция объектов Содержание (Context) объекта Сессия (Session) включает все пункты, которые добавлялись в WEB-сессию с помощью команд сценария. Объект Контекст объекта (ObjectContext) обеспечивает доступ к контексту текущего объекта. Как правило, он порождает экземпляры объектов MTS или контролирует транзакции базы данных.

Объект Отклик (Response) записывает информацию в виде потока страниц HTML и отсылает ее в браузер клиента. Объект Отклик (Response) также поддерживает коллекцию, состоящую из объектов, содержащих сведения, которые могут быть записаны в систему клиента. Они в последствии могут быть прочитаны объектом Запрос (Request).

Рисунок А. Модель объектов ASP
1 — Контекст сценария
2 — Приложение
3 — Содержание
4 — Статические объекты
5 — Определяемые пользователем объекты
6 — Контекст объекта
7 — Запрос
8 — Формы
9 — Строка запроса
11 — Сервер
12 — Сессия
13 — Отклик

Обработка ошибок в ASP.NET приложении.

Проблема

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

Решение

Для этого придется внести изменения в Global.asax. Данный файл содержит методы, обрабатывающие события уровня приложения и сессии. Нам нужно будет работать с методом Application_Error. Кроме того, нужно будет создать страницу, назовем ее Error.aspx, сообщающую о возникшей ошибке.

Здесь возможно несколько подходов к реализации процесса оповещения об ошибке.

1. Сообщить пользователю об ошибке и предоставить информацию о ней. В данном случае код выглядит так:

2. Сообщить администратору

2.1. При помощи электроннной почты

2.2. При помощи записи сообщения в журнал событий Windows


Здесь следует заметить, что зачастую приложение ASP.NET имеет достаточно ограниченный набор прав (что, в принципе, правильно с точки зрения безопасности). В связи с этим мы не сможем программно создать Event Source или проверить его существование в журнале событий Windows, если не будем использовать имперсонацию (impersonate). Решением может выступать ручное создание Event Source. Для этого внесем в реестр новый ключ, воспользовавшись программой regedit.

Нам необходимо добавить новый ключ по адресу

Его имя должно совпадать с указанным в коде. В нашем случае это ErrorSample.

3. При помощи комбинации вышеперечисленных методов

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

Альтернатива

Следует заметить, что намного эффективнее будет использовать один из параметров файла web.config. Это позволит быстро (без изменения кода), менять ссылку страницы с сообщениями об ошибке или вообще убрать ее, в случае необходимости. Сссылка на нее задается с помощью атрибута defaultRedirect. Кроме того, при использовании данного атрибута в коде, следует убрать строки

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

ASP.NET MVC Урок 5. Создание записи в БД

Цель урока. Отследить весь путь создания записи в БД и вывода его. Вывод ошибок. Валидация. Мапперы. Написание атрибута валидации. Капча. Создание данных в БД.

Введение

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

  • Post\get запрос на сайт
  • Авторизация и аутентификация
  • Проверка введенных данных (валидация) на правильность
  • Если проверка введенных данных показала, что введенные данные неверны, то в заполняемую форму выводится предупреждение.
  • Если проверка введенных данных показала, что эти данные верны, то они сохраняются в БД и выводится страница с подтверждением.

Регистрация

Сделаем форму для регистрации пользователя. При регистрации, пользователь должен распознать капчу и повторить ввод пароля. Но начнем без этого. Создадим метод Register в контроллере UserController и View.

Создаем и передаем во View новый объект User. Так как полей у нас пока только два, для заполнения создаем View:

Все эти дивы, fieldset’ы и button’ы сделаны по подобию, как это описано в фреймворке bootstrap (далее будем изучать).
Изучим основные Html-вставки:

— формирует тег и закрывает его после вызова Dispose() (закрытие кавычек using() <> )

— формирует тег
— выводит тег ошибки если такая есть

После нажатия на кнопку Register идет Http-запрос типа POST (так как FormMethod.Post и передает данные Email=&Password=.
Создадим метод Register, принимающий в качестве параметра тип User, и пометим его атрибутом HttpPost, а предыдущий — атрибутом HttpGet. Контроллер различает, какой из типов запроса сейчас происходит и перенаправляет на тот, который необходим:

Сделаем точку останова на втором методе Register и проверим, какой объект приходит к нам:

Видим, что поля Email и Password заполнены, остальные остались нулевыми или по умолчанию (default).
Так как мы должны принять еще 2 поля (повтор пароля и капчу), то добавим эти поля в наш User partial class:

Добавим поля во View:

Капчу пока не будем делать, просто она будет равна 1234.

Валидация

Условия для правильности данных:

  • Поле email не нулевое
  • Email – это корректно введенный адрес почты, т.е. с собачкой
  • Email добавляемый в БД — уникальный
  • Пароль не нулевой
  • Пароли совпадают
  • Капча равна 1234

Если какое-то из этих условий не соблюдается, то выдается ошибка.

IValidatableObject

Так как у нас класс User — partial, то мы можем реализовать для него IValidatableObject интерфейс, для этого, правда, придется добавить в проект System.Component.DataAnnotation. Это не очень хорошо, так как эта сборка необходима для валидации, а валидация – это прерогатива контроллеров в MVC. Так что мы тут немного нарушаем принцип.
Класс User:

Мы смогли сделать проверку 4 из 6 правил валидации, но оставим пока так, а остальные добавим непосредственно в контроллере.
Выполняем форму, получаем:

Видим, что обе наши ошибки были отловлены.

Есть два стандартных метода вывести ошибку: это Html.ValidationMessage(“ErrorField”) и Html.ValidationSummary(). Первый выводит ошибку, связанную с конкретным неверновведенным полем, а второе — выведет все (или все оставшиеся) ошибки.

Добавляем в контроллер проверку на капчу и проверку на существование Email в БД (/Areas/Default/UserController.cs:Register):

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

  • Класс User всегда будет содержать проверку на необходимость введения пароля и идентичность паролей, а, например, при изменении данных в личном кабинете, мы вообще не должны вводить пароль. Т.е. необходимо будет вводить другие поля, которые будут обозначать: это регистрация, это смена пароля, это изменение данных.
  • Валидацию мы сделали частично в Model-части и частично в Controller-части – это не совсем хрестоматийно.

Но есть решение, мы создаем класс, который является представлением класса User, организующим валидацию. Мы назовем его UserView и создадим в папке Models/ViewModels:

Automapping

Прежде чем приступить к использованию этого класса, стоит заметить, что это не совсем удобно. Мы создали совершенно другой класс, но добавлять в БД мы должны класс User, а это означает, что в каком-то месте программы мы должны передавать от объекта UserView в User поля, так и наоборот. А при большом количестве объектов и полей – это рутинно, к тому же, подобное у нас уже есть в функции Update[Table] в репозитории. Для решения этой задачи существуют так называемые мапперы object-to-object.
Одним из самых популярных, является automapper (http://automapper.org/). Собственно, эта библиотека берет на себя работу по переводу одного объекта в другой, и, как мы дальше увидим, там еще есть много других вкусных плюшек.

Так как при разработке программы мы избегаем сильную связность, то организуем интерфейс + реализацию и зарегистрируем это в Ninject, после чего выведем использование в контроллер.
Создаем в /Mappers:

Регистрация (пусть будет как объект-одиночка) (/App_Start/NinjectWebCommon.cs):

В BaseController (/Controllers/BaseController.cs):

Теперь изменим UserController (и View) с использованием UserView:

И в Register.cshtml изменится первая строка:

Атрибуты

Для UserView будем использовать для валидации атрибуты.

Мы смогли описать тут 5 из 6 правил валидации. Правила, касающегося верного введенного email – нет. Напишем для этого свой класс-атрибут, проверяющий корректность введенного email:

Вначале проверяем, что полученный объект есть строка, и строка не пустая, иначе возвращаем значение «истина» в проверке. Тут срабатывает правило, что «мы у инопланетян документы не проверяем», т.е. пока нет достаточных условий для проверки – мы не проверяем, а проверять будут другие атрибуты. Потом же, с помощью регулярного выражения, проверяем. При желании, в интернете можно найти более полную проверку регулярным выражением с использованием всех доменов первого уровня.

Примечание: Можно подключить DataAnnotationsExtensions, чтобы не писать самому нужные атрибуты (http://dataannotationsextensions.org/)

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

    Добавляем поле в БД. Birthdate datetime null.
    Примечание: возможно, надо будет снять эту галочку, чтобы спокойно изменять структуру БД:

  • В данных выставим всем записям значения 2012-1-1
  • Изменим поле Birthdate на datetime not null
  • Удаляем из LessonProjectDb.dbml таблицу User и заново переносим из Server Explorer
  • В SqlRepository/User.cs добавляем строку в UpdateUser():
  • В UserView у нас будет совершенно другое представление о поле Bithdate. И об этом чуть подробнее отдельно.
  • Выбор дня рождения у нас будет таким:

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

    Для выбора, например, из 1 — apple, 2 – orange (выбран), 3 — banana мы должны написать следующий код:

    И передать в DropDownList() вторым параметром, первый параметр – name, которому присвоится значение Value при подтверждении (сабмите) формы.
    Cоздадим реализацию для выбора дня рождения:

    Запустим приложение и поставим брейк-поинт point на приеме данных. Проверим, как мы получаем данные для полей даты рождения для объекта UserView:

    Теперь осталось правильно передать их в объект User. Опишем эту передачу в описании маппинга (/Mappers/CommonMapper.cs):

    Здесь мы задаем правила однозначного перевода из свойств BirthdateDay, BirthdateMonth, BirthdateYear в Birthdate и обратно.

    Captcha

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

    Теперь сделаем метод вывода UserController.Captcha():

    Что здесь происходит:

    • В сессии создаем случайное число от 1111 до 9999.
    • Создаем в ci объект CatchaImage
    • Очищаем поток вывода
    • Задаем header для mime-типа этого http-ответа будет “image/jpeg” т.е. картинка формата jpeg.
    • Сохраняем bitmap в выходной поток с форматом ImageFormat.Jpeg
    • Освобождаем ресурсы Bitmap
    • Возвращаем null, так как основная информация уже передана в поток вывода

    Запрашиваем картинку из Register.cshtml (/Areas/Default/View/User/Register.cshtml):

    Вот и всё, закончили. Добавляем создание записи и проверяем, как она работает:

    Создание страниц ASP.NET в среде Visual Studio

    Среда Visual Studio существенно облегчает разработку Web-приложений. Основными действиями, выполняемыми в ходе создания приложения в среде, являются создание форм, написание обработчиков событий, добавление файлов (таблиц стилей, страниц и т.п.), отладка

    В Visual Studio разных версий предлагается несколько режимов создания Web-приложений, функционирующих на основе ASP.NET, чаще всего используются Website… и Project… В Visual Studio 2005 включен только Website…, в 2008 и 2010 – оба.

    В режиме создания Web-сайта (File — New Website…). Visual Studio создает только файлы, относящиеся к сайту (файл с кодом страницы, файл с программами обработчиков и файл конфигурации).

    В окне New Web Site могут быть дополнительно указаны параметры: версия .NET, шаблон (выбираем ASP.NET WEB Site), размещение (место хранения файлов Web-сайта), язык программирования. После того, как выбор сделан (нажата ОК) будет создана заготовка Web-приложения (три основных файла). Компиляция страниц будет выполняться средой ASP.NET перед открытием в браузере.

    В режиме создания проекта (File — New Project…) кроме основных файлов, генерируется несколько вспомогательных и файл проекта с расширением .csproj, в котором фиксируются составляющие проект файлы и сохраняются некоторые отладочные параметры.

    В окне New Project кроме типа (ASP.NET Web Application), места размещения и языка, необходимо выбрать имя (Solution Name), которое затем будет использовано для создания в выбранном месте размещения соответствующего подкаталога.

    В отличие от режима создания Web Site, кроме размещения информации в различных файлах, при запуске Web-проекты компилируются Visual Studio (а не ASP.NET). Классы Web-страниц объединяются в одну сборку, которая получает то же имя, что и у Web-проекта (например, WebApplication) и затем размещается в папке bin. В Web-проекте для страниц всегда используют модель отделенного кода, объявления для всех элементов управления содержаться в файле с расширением .aspx.desginer.cs. Во время компиляции файлы с кодами обработчиков и кодами элементов управления будут объединены. В беспроектном Web-сайте файла с объявлениями элементов управления нет, поскольку эта часть кода генерируется во время компиляции системой ASP.NET. Есть и другие отличия (например, в содержании директивы Page и т.п.), останавливаться на которых мы не будем.

    Дальнейшие действия по созданию Web-приложения практически не отличаются.

    В ходе работы по созданию сайтов используются окна и панели, состав и место расположения которых можно изменять, используя меню View и перетаскивая их мышью. Типичный вид среды при разработке Web-приложений приведен на рис.4.4.

    Рис. 4.4. Вид окна для разработки Web-приложений

    Панели инструментов, содержат различные команды для форматирования текста, поиска текста и т.д.

    Обозреватель решений, отображает файлы и папки веб-узла.

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

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

    Панель элементов содержит элементы управления и HTML-элементы, которые можно размещать на страницах.

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

    Окно вывода служит для вывода сообщений среды (ошибки, информация отладчика и т.п.).

    Создание форм. Создаваемые документы (формы и файлы с программным кодом) открываются в окне документов. При работе с формами предусмотрено два режима отображения Design и Source. В первом режиме интерфейс можно конструировать визуально, во втором – путем написания кода разметки. Для переключения используются закладки в нижней части окна. В режиме Design можно повысить наглядность отображаемой структуры, выполнив команду Details из меню View.

    Форма ASP.NET – документ, на основе которого формируется HTML-страница, отправляемая клиенту. Она создается путем размещения элементов в окне документов. Элементы для размещения выбираются из панели инструментов. В панели элементы сгруппированы по типам.

    Чаще всего используются элементы из групп HTML и Standard.

    Группа HTML содержит HTML-элементы, соответствующие одноименным элементам обычных Web-страниц. С их использование создается статическая разметка страницы. Однако они могут быть преобразованы в серверные путем добавления атрибута runat=»server» или выполнения команды Run As Server Control из контекстного меню элемента. Их называют серверными HTML-элементами управления, при их обработке перед отправкой формируется только один HTML-тег.

    Группа Standard содержит серверные элементы управления с расширенной функциональностью. Среди них имеются полнофункциональные элементы управления, выполняющие генерацию достаточно сложного HTML-кода и клиентских сценариев JavaScript для создания развитого интерфейса на клиенте. Это такие элементы как Calendar, AdRotator, TreeView. Среди них есть и аналоги HTML-элементов (кнопок, текстовых полей и т.д.). Элементы этой группы называют серверными Web-элементами управления, они являются основными при создании форм.

    Среди других групп отметим такие.

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

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

    Validation — элементы управления проверкой правильности заполнения полей пользователем.

    Data — элементы управления данными.

    После размещения элемента имеется возможность задания его свойств с помощью окна свойств. Элемент необходимо выделить, в окне отобразятся его свойства, которые можно изменять.

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

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

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

    Илон Маск рекомендует:  Хочу изменить вид маркера на другой символ. Как это сделать
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL