Asp примеры asp


Содержание

Пример веб сайта на ASP.NET Web Forms

Веб-сайт построен на базе Web Forms программной технологии ASP.NET, язык программирования C#. Дизайн сайта на основе свободно распространяемых шаблонов. Сайт состоит из нескольких страниц для большей наглядности. Все веб-страницы размещены в корневом каталоге.

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

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

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

Мастер-страница по сути обыкновенная страница ASPX, но с специальным расширением .master. Также, как и любая страница aspx, она состоит из двух страниц, одна с html кодом (плюс внедряемый код), другая с отделенным программным кодом на языках .NET: C# или Visual Basic.

Листинг №1 Вид мастер страницы

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

Листинг №2 Вид дочерней страницы

Сайт создан в Visual Studio 2013. Исходник веб-сайта можно открыть и редактировать в Visual Studio 2010, Visual Studio 2012, Visual Studio 2013 любых версий, а также в SharpDevelop 5.x.

Asp примеры 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-страницы. На первый взгляд, можно просто написать

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

Для этого существуют внешние компоненты, есть и бесплатные. Например, компонента Jmail от Dimac. Все, что для нее нужно – это адрес SMTP-сервера. Вот пример ее использования:

Простое приложение ASP.NET MVC 5

ASP.NET — ASP.NET MVC 5 — Простое приложение ASP.NET MVC 5

В этой статье будут исследованы другие базовые функциональные средства MVC на примере построения простого приложения для ввода данных. Цель заключается в демонстрации инфраструктуры MVC в действии, поэтому некоторые из объяснений относительно того, что происходит «за кулисами», будут пропущены. Однако не беспокойтесь — мы вернемся к подробному обсуждению этих тем позже. А теперь продолжим работать над проектом, который мы создали в предыдущей статье.

Предварительная настройка

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

домашняя страница, отображающая информацию о вечеринке;

форма, которая может использоваться для ответа на приглашение (repondez s’il vous plait — RSVP);

проверка достоверности для формы RSVP, которая будет отображать страницу с выражением благодарности за внимание;

средство отправки форм RSVP по электронной почте организатору вечеринки.

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

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

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

В аббревиатуре MVC буква «M» обозначает model (модель), и она является наиболее важной частью приложения. — это представление реальных объектов, процессов и правил, которые определяют сферу приложения, известную как предметная область.

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

Для приложения Party Invites сложная модель не требуется, поскольку оно совсем простое, и нужно создать только один класс предметной области, который будет назван GuestResponse. Этот объект будет отвечать за хранение, проверку достоверности и подтверждение ответа на приглашение (RSVP).

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

По соглашению MVC классы, которые образуют модель, помещаются в папку Models, которую Visual Studio создает во время начальной настройки проекта. Щелкните правой кнопкой мыши на папке Models в окне Solution Explorer и выберите в контекстном меню пункт Add, а затем пункт Class (Класс). В качестве имени файла укажите GuestResponse.cs и щелкните на кнопке Add, чтобы создать класс.

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

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

Вы могли заметить, что свойство WillAttend имеет тип bool, допускающий null, т.е. оно может принимать значение true, false или null. Объяснение этого будет приведено в разделе «Добавление проверки достоверности» далее.

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

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

Html.ActionLink() — это вспомогательный метод HTML. В MVC Framework доступен набор встроенных вспомогательных методов, которые удобны при визуализации ссылок, полей ввода текста, флажков, списков выбора и другого вида HTML-содержимого. Метод ActionLink принимает два параметра: первым является текст (анкор ссылки), который должен отображаться в ссылке, а вторым — действие, которое должно выполняться, когда пользователь щелкает на ссылке.

Просмотреть то, что создал вспомогательный метод, можно, запустив проект:

Если навести курсор мыши поверх ссылки в браузере, станет видно, что ссылка указывает на http://ваш-сервер/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, как показано в примере ниже:

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

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

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

Щелкните правой кнопкой мыши внутри метода RsvpForm в редакторе кода и выберите в контекстном меню пункт Add View (Добавить представление), чтобы открыть диалоговое окно Add View. Удостоверьтесь, что в поле View Name (Имя представления) указано имя RsvpForm, выберите в списке Template (Шаблон) вариант Empty (Пустой), а в списке Model Class (Класс модели) — вариант GuestResponse. Оставьте все флажки в разделе View Options (Параметры представления) неотмеченными:

Щелкните на кнопке Add, среда Visual Studio создаст новый файл по имени RvspForm.cshtml в папке Views/Home и откроет его для редактирования. В примере ниже приведено первоначальное содержимое этого файла. Это еще один скелетный HTML-файл, но в нем присутствует Razor-выражение @model. Как вы вскоре убедитесь, этот файл служит ключом к созданию строго типизированного представления и к получению предлагаемых им удобств.

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

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

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

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

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

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

Альтернативой применению лямбда-выражений является ссылка на имя свойства типа модели как на строку:

Подход с использованием лямбда-выражения предотвращает неправильный ввод имени свойства типа модели, т.к. среда Visual Studio активизирует средство IntelliSense, позволяя выбрать свойство автоматически:

Еще одним удобным вспомогательным методом является Html.BeginForm(), который генерирует HTML-элемент form, сконфигурированный на выполнение обратной отправки методу действия. Поскольку никакие аргументы вспомогательному методу не передаются, он предполагает, что требуется выполнить обратную отправку по тому же самому URL, из которого запрашивался HTML-документ. Изящный трюк заключается в том, чтобы поместить этот метод внутрь C#-оператора using, как показано ниже:

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

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

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

Установка начального URL-адреса

Стремясь быть полезной, среда Visual Studio будет выполнять запрос в браузере URL-адреса, основываясь на представлении, которое редактируется в текущий момент. Это ненадежная возможность, поскольку она не работает при редактировании файлов других видов, к тому же в сложных веб-приложениях нельзя просто переходить в произвольные точки.

Чтобы установить фиксированный URL-адрес для запроса в браузере, выберите в меню Project (Проект) среды Visual Studio пункт PartyInvites Properties (Свойства PartyInvites), перейдите в раздел Web и отметьте переключатель Specific Page (Определенная страница) в категории Start Action (Начальное действие), как показано на рисунке ниже:

Вводить значение в поле рядом с переключателем вовсе не обязательно — Visual Studio будет запрашивать стандартный URL-адрес для проекта, который указывает на метод действия Index контроллера Home.

Форму в представлении RsvpForm можно увидеть, запустив приложение и щелкнув на ссылке «Форма RSVP». Результат показан на рисунке ниже:

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

Инфраструктуре MVC пока еще не указано, что должно быть сделано, когда форма отправляется серверу. В нынешнем состоянии приложения щелчок на кнопке «Отправить форму 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. В примере ниже показаны изменения, которые необходимо внести в класс HomeController.

К существующему методу действия RsvpForm был добавлен атрибут HttpGet. Это указывает MVC, что данный метод должен использоваться только для запросов GET.

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

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

Первая перегруженная версия метода действия RsvpForm визуализирует то же самое представление, что и ранее (файл RsvpForm.cshtml), для генерации формы, показанной на рисунке выше.

Вторая перегруженная версия более интересна из-за наличия параметра. Но с учетом того, что этот метод действия будет вызываться в ответ на HTTP-запрос POST, а тип GuestResponse является классом C#, каким образом они соединяются между собой?

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


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

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

Визуализация других представлений

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

Этот вызов метода View сообщает MVC, что нужно найти и визуализировать представление Thanks и передать ему объект GuestResponse. Чтобы создать указанное представление, щелкните правой кнопкой мыши на любом из методов класса HomeController и выберите в контекстном меню пункт Add View (Добавить представление). С помощью открывшегося диалогового окна Add View создайте строго типизированное представление по имени Thanks, в котором применяется класс модели GuestResponse и которое основано на шаблоне Empty. Среда Visual Studio создаст представление в виде файла Views/Home/Thanks.cshtml.

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

Представление Thanks использует механизм визуализации Razor, чтобы отображать содержимое в зависимости от значения свойства GuestResponse, переданного вызову View в методе действия RsvpForm. Выражение @model синтаксиса Razor указывает тип модели предметной области, для которого представление строго типизировано.

Для получения доступа к значению свойства в объекте предметной области применяется конструкция Model.ИмяСвойства. Например, для получения значения свойства Name используется Model.Name.

Теперь, когда создано представление Thanks, появился работающий базовый пример обработки формы с помощью MVC. Запустите приложение в Visual Studio, щелкните на ссылке «Форма RSVP», введите какие-нибудь данные внутри формы и щелкните на кнопке «Отправить форму RSVP». Отобразится результат, показанный на рисунке ниже (он может отличаться, если введено другое имя и было указано о невозможности посетить вечеринку).

Добавление проверки достоверности

Теперь пора добавить в приложение проверку достоверности вводимых данных. В отсутствие проверки достоверности пользователи смогут вводить бессмысленные данные или даже отправлять пустую форму.

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

Инфраструктура ASP.NET MVC поддерживает декларативные правила проверки достоверности, определенные с помощью атрибутов из пространства имен System.ComponentModel.DataAnnotations, а это значит, что ограничения проверки достоверности выражаются с помощью стандартных атрибутов C#. В примере ниже показано, как применить эти атрибуты к классу модели GuestResponse:

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

Как уже отмечалось ранее, для свойства WillAttend был выбран булевский тип, допускающий значение null. Это было сделано для того, чтобы можно было применить атрибут проверки Required. В случае использования обычного булевского типа значением, получаемым посредством привязки модели, могло бы быть только true или false, и не было бы возможности определить, выбрал ли пользователь значение. Булевский тип, допускающий null, имеет три разрешенных значения: true, false и null. Значение null будет применяться, если пользователь не выбрал значение, и это вынудит атрибут Required сообщить об ошибке проверки достоверности. Это хороший пример того, насколько элегантно инфраструктура MVC Framework сочетает средства C# с HTML и HTTP.

Проверку на наличие проблемы с достоверностью данных можно выполнить с использованием свойства ModelState.IsValid в классе контроллера. В примере ниже показано, как это реализовано в методе действия RsvpForm, поддерживающем запросы POST, внутри класса контроллера Home:

Если ошибки проверки достоверности отсутствуют, мы указываем MVC, что нужно визуализировать представление Thanks, как это делалось ранее. В случае обнаружения ошибок проверки достоверности мы повторно визуализируем представление RsvpForm вызывая метод View() без параметров.

Простое отображение формы в ситуации, когда имеется ошибка, не особенно полезно — мы должны также предоставить пользователю информацию, в чем заключается проблема, и почему принять отправку формы невозможно. Это делается с применением вспомогательного метода Html.ValidationSummary() в представлении RsvpForm, как показано в примере ниже:

В отсутствие ошибок метод Html.ValidationSummary() создает скрытый элемент списка в виде заполнителя внутри формы. Инфраструктура MVC делает заполнитель видимым и добавляет сообщения об ошибках, определенные атрибутами проверки достоверности. Результирующее окно показано на рисунке:

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

Если вам приходилось иметь дело с ASP.NET Web Forms, то вы знаете, что в Web Forms имеется концепция серверных элементов управления, которые сохраняют состояние, сериализуя значения в скрытое поле формы по имени _VIEWSTATE. Привязка модели ASP.NET MVC не имеет никакого отношения к концепциям серверных элементов управления, обратным отправкам или средству View State, характерным для Web Forms. Инфраструктура ASP.NET MVC не внедряет скрытое поле _VIEWSTATE в визуализированные HTML-страницы.

Подсветка полей с недопустимыми значениями

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

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

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

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

Соглашение, принятое в проектах MVC, предусматривает помещение статического содержимого, такого как таблицы стилей CSS, в папку по имени Content. Создайте эту папку, щелкнув правой кнопкой мыши на элементе PartyInvites в окне Solution Explorer, выбрав в контекстном меню пункт Add New Folder (Добавить Новая папка) и указав Content в качестве имени папки.

Чтобы создать файл CSS, щелкните правой кнопкой мыши на только что созданной папке Content, выберите в контекстном меню пункт Add New Item (Добавить Новый элемент) и выберите Style Sheet (Таблица стилей) из набора шаблонов элементов. Установите имя нового файла Styles.css, как показано на рисунке ниже:

Щелкните на кнопке Add и Visual Studio создаст файл Content/Styles.css. Приведите содержимое этого файла в соответствие со следующим кодом:

Для использования этой таблицы стилей добавляется новая ссылка в раздел head представления RsvpForm, как показано в примере ниже. Элементы link добавляются к представлениям точно так же, как к обычным статическим файлам HTML, хотя позже будет продемонстрировано средство пакетов, которое позволяет объединять сценарии JavaScript и таблицы стилей CSS и доставлять их в браузеры с помощью единственного HTTP-запроса.

Файлы JavaScript и CSS можно перетаскивать из окна Solution Explorer в редактор кода. Среда Visual Studio создаст элементы script и link для выбранных файлов.

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

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

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

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

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

Стилизация содержимого

Базовая функциональность приложения на месте (кроме отправки электронной почты, к которой мы вскоре приступим), однако его внешний вид в целом довольно-таки непривлекателен. Несмотря на то что это руководство по MVC сосредоточено на разработке серверной стороны, полезно рассмотреть несколько библиотек с открытым кодом, которые приняты Microsoft и включены в ряд шаблонов проектов Visual Studio.

Я не являюсь большим поклонником упомянутых шаблонов, но мне нравятся некоторые из используемых ими библиотек, и одним таким примером из числа задействованных в MVC 5 является Bootstrap, которая представляет собой удобную библиотеку CSS, первоначально разработанную в Twitter и получившую широкое применение.

Разумеется, вы не обязаны применять шаблоны проектов Visual Studio, чтобы пользоваться библиотеками вроде Bootstrap. Можно загрузить файлы напрямую из веб-сайтов с нужными библиотеками или воспользоваться инструментом NuGet, интегрированным в Visual Studio и предоставляющим доступ к каталогу заранее упакованного программного обеспечения, которое может быть загружено и установлено автоматически.

Одной из лучших характеристик NuGet является то, что данный инструмент управляет зависимостями между пакетами, так что во время установки, к примеру, библиотеки Bootstrap инструмент NuGet также загрузит и установит библиотеку jQuery, от которой зависит Bootstrap.

Использование NuGet для установки Bootstrap

Чтобы установить пакет Bootstrap, выберите пункт Library Package Manager Package Manager Console в меню Tools среды Visual Studio. Откроется окно командной строки NuGet. Введите следующую команду и нажмите клавишу :

Команда Install-Package сообщает NuGet о необходимости загрузки пакета вместе с его зависимостями и затем добавления всего этого в проект. Нужный пакет называется bootstrap. Имена пакетов можно либо искать на веб-сайте NuGet (http://www.nuget.org), либо прибегнуть к услугам пользовательского интерфейса NuGet в Visual Studio (выберите пункт меню Tools Library Package Manager Manage NuGet Packages for Solution.

Ключ командной строки -version использовался для указания на то, что требуется версия 3 библиотеки Bootstrap, которая является последней доступной стабильной версией. Без ключа -version инструмент NuGet загрузил бы последнюю версию пакета, но для гарантии того, что вы в точности воссоздадите примеры, приведенные ниже, необходимо установить эту конкретную версию.

Инструмент NuGet загрузит все файлы, требующиеся для библиотеки Bootstrap, а также для библиотеки jQuery, на которую опирается Bootstrap. Файлы CSS помещаются в папку Content. Кроме того, создается папка Scripts (которая в MVC является стандартным местоположением для файлов JavaScript) и заполняется файлами Bootstrap и jQuery. (Также создается папка fonts — это индивидуальная особенность библиотеки Bootstrap, которая ожидает наличия файлов в определенных местах.)

Причина рассмотрения Bootstrap в этой статье — иллюстрация того, насколько легко HTML-разметка, генерируемая MVC Framework, может применяться с популярными библиотеками CSS и JavaScript. Тем не менее, основное внимание в настоящем руководстве уделяется разработке серверной стороны.

Стилизация представления index

Базовые средства Bootstrap работают путем применения классов к элементам, которые соответствуют селекторам CSS, определенным внутри добавленных в папку Content файлов. Подробную информацию о классах, определенных в библиотеке Bootstrap, можно получить на веб-сайте Bootstrap, а в примере ниже демонстрируется использование ряда базовых стилей в представлении Index.cshtml:

В разметку были добавлены элементы link для файлов bootstrap.css и bootstrap-theme.css из папки Content. Они являются файлами Bootstrap, требуемыми для базовой стилизации CSS, обеспечиваемой этой библиотекой. Вдобавок в папке Scripts имеется соответствующий файл JavaScript, но в данной статье он не нужен. Кроме того, определен также элемент style, который устанавливает цвет фона для элемента body и стили текста для элементов .

Вы заметите, что для каждого файла Bootstrap в папке Content имеется двойник с суффиксом min — например, есть файлы bootstrap.css и bootstrap.min.css. Это распространенная практика минимизации файлов JavaScript и CSS при развертывании приложений в производственной среде, которая представляет собой процесс удаления всех пробельных символов, а также в случае файлов JavaScript замену имен функций и переменных более короткими метками. Целью минимизации является сокращение объема передаваемых данных, необходимых для доставки содержимого в браузер.

После импортирования стилей Bootstrap и определения пары собственных стилей осталось стилизовать элементы. Рассматриваемый пример прост, поэтому необходимо использовать только три класса CSS из Bootstrap: text-center, btn и btn-success.

Полученные в итоге результаты показаны на рисунке ниже:

Стилизация представления RsvpForm

В библиотеке Bootstrap определены классы, которые могут использоваться для стилизации форм. Я не планирую вдаваться в особые детали, но в примере ниже показано, как были применены эти классы:

Классы Bootstrap в этом примере создают панель с заголовком, просто чтобы придать компоновке структурированность. Для стилизации формы используется класс form-group, который стилизует элемент, содержащий label и связанный элемент input или select.

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

Объект для атрибутов создается с использованием анонимных типов C# и указывает, что в элементе, генерируемом вспомогательным методом TextBoxFor, атрибут class должен быть установлен в form-control. Свойства, определяемые этим объектом, применяются для имени атрибута, добавляемого к HTML-элементу, а поскольку class является зарезервированным словом в языке C#, оно предваряется символом @. Это стандартная возможность C#, которая позволяет использовать ключевые слова в выражениях.

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

Стилизация представления Thanks

Последним представлением, подлежащим стилизации, является Thanks.cshtml, в примере ниже показано, как это делается. Вы заметите, что добавленная разметка похожа на таковую из представления Index.cshtml. Чтобы упростить управление приложением, имеет смысл избегать дублирования кода и разметки везде, где это возможно. Позже будут рассмотрены компоновки Razor и описаны частичные представления, которые способствуют сокращению дублирования разметки.

Класс lead применяет один из типографских стилей Bootstrap. Результаты можно видеть на рисунке ниже:

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

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

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

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

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

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

.asp и .aspx 2020

ASP является основой для веб-разработки и поддерживает различные модели, такие как классический ASP, веб-формы ASP.NET, ASP.NET MVC, веб-страницы ASP.NET, API ASP.NET и ядро ​​ASP.NET.

ASP и ASP.NET — это серверные технологии, выполняющие код на веб-сервере.

Активные страницы сервера (ASP), разработанные Microsoft, такие же, как страницы HTML, содержащие скрипты и встроенные носители, а затем обработанные на веб-сервере. В прошлом (с классическим ASP) он был развернут только в среде Microsoft.

Активные серверные страницы имеют расширения файлов .asp (для классического ASP) или .aspx (для ASP.NET)

Когда веб-пользователь инициирует запрос, вызывая страницу ASP или ASP.NET, веб-сервер обрабатывает Активные страницы сервера и механизм сценариев генерирует содержимое, отображаемое обратно (на лету) веб-пользователю. ASP работает с любым браузером, поддерживающим HTML (как вывод HTML).

Активные страницы сервера представить интерфейсные веб-приложения, выполнив ActiveX скриптов и компонентов, вставленных в веб-страницы.

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

ASP.NET был впервые выпущен в 2002 году в .NET Framework 1.0, и заменил Classic ASP, который выпустил три версии в период с 1996 по 2000 год.

Последняя версия Classic ASP была выпущена в ноябре 2000 года как ASP 3.0 для IIS 5.0 и до сих пор официально поддерживается Microsoft до 2020 года.

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

Классический ASP

Первоначально ASP была дополнением для Microsoft IIS (Internet Information Server), однако, с выпуском Windows Server 2000, он стал постоянным и свободным компонентом IIS.

Microsoft Internet Information Services — настраиваемый и модульный механизм веб-сервера Microsoft, который поддерживает протоколы HTTP, HTTPS, FTP, FTPS, SMTP и NNTP.

Являясь первым сервером Microsoft на языке сценариев для динамических веб-страниц, классический ASP (.asp) может работать только на платформе Microsoft, поскольку используются два языка: VBScript и JScript. В то время Microsoft не предоставляла встроенную поддержку других языков программирования.

VBScript был фактически разработан для браузеров Internet Explorer и ограничен функциональностью в пределах своих возможностей сценариев, а JScript поддерживался только в браузерах Internet Explorer и Netscape.

.NET Framework

Microsoft .NET Framework[i] является средой для разработчиков для создания динамических веб-сайтов, веб-приложений и веб-сервисов.

Это программная среда (среда), которая предоставляет большую библиотеку классов (Библиотека классов классов — FCL) и поддерживает несколько языков, позволяющих системе обрабатывать код, написанный на других языках.

.NET-программы выполняются в Common Language Runtime (CLR) среды, поэтому, по существу, FCL и CLR составляют .NET Framework.

В течение последних 15 лет .NET выпустила накопительные обновления и подкомпоненты, обеспечив стабильную и широко внедренную веб-платформу, которая больше не является эксклюзивным для среды Microsoft.

Хотя выпуски ASP.NET тесно параллельны выпускам IIS, их можно разрабатывать на других платформах, таких как Spring.NET (framework для Java).

Перенос из ASP в ASPX

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

Существует обширный список улучшений, которые могли бы мотивировать решение о миграции, с очень небольшим количеством причин, чтобы не смотреть на некоторые из мотивов:

ASP.NET MVC лучшие практики

Для начала скажу, что я .NET приверженец до мозга костей, не скажу, что остальные технологии чужды, но то самое ламповое и теплое я нашел для себя в .NET и в ASP.NET MVC в частности. Но как бы не была прекрасна технология, она лишь инструмент, который при грамотном использовании и модернизации становится действительно мощным и полезным. Так же с ASP.NET MVC – существуют проблемы, которые не имеют решения «из коробки». Именно такие проблемы я выделил и сгруппировал по своему усмотрению.

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

Общие проблемы архитектуры

Данный вопрос включает в себя понимание многослойной архитектуры приложений и умение грамотно сформировать solution на уровне проектов и файлов. Пример хорошей организации:

Данный пример показывает организацию solution’а в рамках проектов. Проект ядра содержит все доменные модели, интерфейсы, ключевые сущности. Данный проект составляет основу приложения. Проект бизнес логики содержит всю необходимую бизнес логику, которая инкапсулирована в менеджерах и которая не должна иметь платформенных зависимостей. Проект доступа к данным — рекомендую использовать паттерн репозиторий, который помогает инкапсулировать (скрывать) доступ к хранилищу данных. К примеру, вы можете реализовать работу с данными, используя различные ORM, либо использовать хранимые процедуры. Проект контейнера инверсии управления содержит непосредственно сам контейнер, а так же настройки зависимостей абстракций и реализаций (интерфейсов и реализаций интерфейсов). Проект веб проекта содержит все наши контроллеры, css, js код, вообщем основную ASP.NET MVC инфраструктуру приложения. Саб веб проект содержит модели представлений, дополнительные хелперы, сущности, которые расширяют функционал веб проекта. Для чего же это нужно? – для обеспечения легкости основного веб проекта, ведь согласитесь, намного проще воспринимать десяток строк и пару папок, чем огромные неповоротливые файлы с ужасной структурой файлов. Но данная архитектура и организация solution’а подходит для небольших проектов. Для больших систем больше подходит следующая схема:

Большие системы имеют ядро — «точку входа» в ASP.NET MVC приложение, а остальная функциональность представлена в виде модулей, которые наращивают функционал. Очень важно анализировать требования проекта и подбирать хорошую архитектуру проекта, так как это очень большая часть хорошего проекта.

Толстые и/или кривые контроллеры

Толстые контроллеры – это бич многих проектов, так как за частую сжатые сроки или неопытность разработчика подталкивают его к написанию всей бизнес логики в контроллер и как итог выходят большие файлы, которые сложно читать и понимать. Контроллер должен выполнять роль посредника, который получил запрос, провалидировал, отдал на обработку и вернул финальное значение. Ни больше ни меньше. В этом и есть его принцип S.O.L.I.D. — единство ответственности. Идеальная ситуация, когда у нас есть менеджеры, которые отвечают за бизнес логику и мы валидируем данные, отдаем менеджерам на обработку, после чего возвращаем результат. Использование своего базового типа для контроллеров полезно когда нам необходимо инкапслуровать общее поведение для нескольких контроллеров, иными словами мы создаем базовый класс контроллера, который после наследуем и пропадает необходимость дублировать какой то общий код в наследуемых контроллерах.

Паттерн Post/Redirect/Get

Post/Redirect/Get (PRG) — модель поведения веб-приложений, используемая разработчиками для защиты от повторной отправки данных веб-форм (от т. н. double submit problem). Модель PRG обеспечивает интуитивно понятное поведение веб-приложений при обновлении страниц в браузере и при использовании закладок в браузере.

Иными словами используйте отдельные типы запросов для отображения данных и для модификации их. Существуют такие ситуации, когда отправка данных формы POST запросом на сервер прошла успешно, вернулась та же страница редактирования и если пользователь просто обновит страницу ему выпадет предупреждение «Подтвердите повторную отправку формы». Данная проблема решается тем, что после модификации данных в качестве результата действия пользователь не должен получить представление, а должен быть перенаправлен на получение данных, как если бы он только заходил в редактирование сущности. Таким образом можно избежать ситуации, когда пользователь может дублировать отправку формы, даже если просто захочет обновить страницу. Данный подход хорош для классической схемы приложения ASP.NET MVC, при асинхронном взаимодействии с сервером схема не применяется.

Cache

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

Использование action filter

Ну хорошо, рассказал, что контроллеры могут быть жирными, что необходимо выносить логику в менеджеры , что можно не дублировать код контроллеров, используя супер типы и кешировать нужные ответы сервера, что же еще скрывается за «толстые» и/или кривые контроллеры? А есть еще такая вещь, как action filters, мощь и пользу которых мало кто из новичков ценит и понимает вообще. Очень распространенная практика, когда программист долго пишет, используя какой-то набор готовых action filtter : авторизации и тд., но своих фильтров не пишет и не задумывается об этом. Приведу пример, как можно, используя фильтры, реализовать задачу более круто, чем с подходом «в лоб». Такой задачей является создание транзакций данных. Для этого нам нужен менеджер транзакций который инкапсулирует работу с транзакциями, а так же создать наш action filter:

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

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

DTO (Data Transfer Objects)

Мир доменных моделей представляет собой набор всех сущностей, что представляют предметную область проекта, в свою же очередь view model – это мир представлений. Модели представлений должны полностью удовлетворять потребности представлений. В множествах источников рекомендуют использовать на каждое отдельное представление отдельную модель. С помощью view model мы можем передать представлению что-то сверх доменной модели. И все бы хорошо, но когда начинаешь использовать такой подход, то сталкиваешься с такими вещами как DTO (Data Transfer Objects) – конвертация из доменной модели в view model и обратно. Для многих это становится микро адом. Проблема всем известна и решение в виде mapper’ов все знают, я же хочу показать несколько интересных подходов для решения этого вопроса. В первом варианте решения используется ручной код, тут предельно просто, у нас всю ответственность за DTO берет на себя view model:

Второй вариант можно использовать с mapper’ами. Суть его в том, что мы используем реализацию двух интерфейсов для указания, от какой доменной модели «пошла» view model, и как реализовать сложный mapping сущности. Сами интерфейсы:

Реализации интерфейсов имеют следующий вид:

Регистрацию мапингов сущностей можно произвести вручную, по-старинке, либо используя LINQ и рефлексию. Как реализовать автоматическую регистрацию:

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

Использование строковых значений

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

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

HTML helper, который будет инкапсулировать наши маршруты. И Использовать его будем так:

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

На практике рекомендуется использовать для отображения данных модели представления, которые позволят строго типизировать представления и дать больше возможности для настройки и сохранить разделение слоев. И очень часто у неопытных разработчиков появляется задача получить данные из модели представления и отдать их на обработку javascript’у. Как итог — выходит, что в представление вклинивается большой блок javascript кода, который и будет «связующим звеном». Выглядит все это так:

Примеры приведены для angular, но они так же будут актуальными для других js framewrk’ов, как к примеру knockout, backbone. Как же решить данные проблемы? А все предельно просто — мы создадим HTML helper, который преобразует наш объект в json и отдаст на обработку скрипту:

И использовать можно вот так:

И если уйти от js framework’ов, то реализация подобного подхода предельно проста — у нас должна быть функция, которая принимает json версию модели и обрабатывает ее далее. Данная практика идет тесно с рекомендацией использовать bundling и minification. Ведь скрипты, которые находятся в представлениях никоим образом не сжимаются и страница становится не оптимальной. Bundling позволяет решить порос минимизации объема кода css и js а так же количества подключений для скачивания файлов.

Взаимодействие с пользователем

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

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

Для хранения наших предупреждений мы будем использовать TempData. Для доступа к коллекции предупреждений реализуем следующее расширение:

Для создания расширения к результату действия мы создадим декоратор для ActionResult, который будет содержать результат действий, css класс для отображения и сообщение для пользователя.

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

Таким образом мы создали методы, которые будут добавлять уведомления пользователю и расширять наш ActionResult. Каждый метод возвращает результат + css класс для уведомления + сам текст уведомления. Для отображения сообщений создадим частичное представление и поместим его в шаблоне страницы.

Результат отображен был на изображении выше.

Итог и финальный best practice

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

Вспомогательные функции тегов в формах в ASP.NET Core Tag Helpers in forms in ASP.NET Core

В этом документе приводятся сведения о работе с формами и элементами HTML, часто используемыми в формах. This document demonstrates working with Forms and the HTML elements commonly used on a Form. Элемент HTML форма предоставляет основной механизм, используемый веб-приложениями для отправки данных на сервер. The HTML Form element provides the primary mechanism web apps use to post back data to the server. В большей части этого документа описываются вспомогательные функции тегов и их применение для создания надежных форм HTML. Most of this document describes Tag Helpers and how they can help you productively create robust HTML forms. Перед прочтением этого документа рекомендуется изучить статью Общие сведения о вспомогательных функциях тегов. We recommend you read Introduction to Tag Helpers before you read this document.

Во многих случаях вспомогательные методы HTML располагают альтернативными вариантами для определенной вспомогательной функции тега, но следует отметить, что вспомогательные функции тегов не заменяют вспомогательные методы HTML и для каждого вспомогательного метода HTML не существует конкретной вспомогательной функции тега. In many cases, HTML Helpers provide an alternative approach to a specific Tag Helper, but it’s important to recognize that Tag Helpers don’t replace HTML Helpers and there’s not a Tag Helper for each HTML Helper. Если есть альтернатива вспомогательному методу HTML, она будет указана. When an HTML Helper alternative exists, it’s mentioned.

Вспомогательная функция тега формы The Form Tag Helper

Вспомогательная функция тега формы: The Form Tag Helper:


Создает значение атрибута HTML

Приведенная выше вспомогательная функция тега формы создает следующий код HTML: The Form Tag Helper above generates the following HTML:

Среда выполнения MVC генерирует значение атрибута action на основе атрибутов вспомогательной функции тега формы asp-controller и asp-action . The MVC runtime generates the action attribute value from the Form Tag Helper attributes asp-controller and asp-action . Вспомогательная функция тега формы также создает скрытый токен проверки запроса для предотвращения подделки межсайтовых запросов (при использовании с атрибутом [ValidateAntiForgeryToken] в методе действия HTTP Post). The Form Tag Helper also generates a hidden Request Verification Token to prevent cross-site request forgery (when used with the [ValidateAntiForgeryToken] attribute in the HTTP Post action method). Защита чистой формы HTML от подделки межсайтовых запросов является трудной задачей, поэтому для ее решения используется вспомогательная функция тега формы. Protecting a pure HTML Form from cross-site request forgery is difficult, the Form Tag Helper provides this service for you.

Использование именованного маршрута Using a named route

Атрибут asp-route вспомогательной функции тега также может создавать разметку для атрибута HTML action . The asp-route Tag Helper attribute can also generate markup for the HTML action attribute. Приложение с маршрутом с именем register использует следующую разметку для страницы регистрации: An app with a route named register could use the following markup for the registration page:

Многие представления в папке Views/Account (сформированные при создании веб-приложения с учетными записями отдельных пользователей) содержат атрибут asp-route-returnurl: Many of the views in the Views/Account folder (generated when you create a new web app with Individual User Accounts) contain the asp-route-returnurl attribute:

Предыдущая разметка создает следующий код HTML. The previous markup generates following HTML:

Отправка формы в пример страницы Submit to page example

Следующая разметка отправляет форму в страницу Razor About . The following markup submits the form to the About Razor Page:

Предыдущая разметка создает следующий код HTML. The previous markup generates following HTML:

Отправка формы в пример маршрута Submit to route example

Рассмотрим конечную точку /Home/Test . Consider the /Home/Test endpoint:

Следующая разметка отправляет форму в конечную точку /Home/Test . The following markup submits the form to the /Home/Test endpoint.

Предыдущая разметка создает следующий код HTML. The previous markup generates following HTML:

Вспомогательная функция тега входных данных The Input Tag Helper

Вспомогательная функция тега входных данных привязывает элемент HTML к модели выражения в представлении Razor. The Input Tag Helper binds an HTML element to a model expression in your razor view.

Вспомогательная функция тега входных данных: The Input Tag Helper:

Создает атрибуты HTML id и name для имени выражения, указанного в атрибуте asp-for . Generates the id and name HTML attributes for the expression name specified in the asp-for attribute. asp-for=»Property1.Property2″ равно m => m.Property1.Property2 . asp-for=»Property1.Property2″ is equivalent to m => m.Property1.Property2 . Имя выражения совпадает со значением атрибута asp-for . The name of the expression is what is used for the asp-for attribute value. Дополнительные сведения см. в разделе Имена выражений . See the Expression names section for additional information.

Задает значение атрибута HTML type на основе атрибутов типа модели и заметок к данным, примененным к свойству модели. Sets the HTML type attribute value based on the model type and data annotation attributes applied to the model property

Значение атрибута HTML type не перезаписывается, если оно указано. Won’t overwrite the HTML type attribute value when one is specified

Создает атрибуты проверки HTML5 из атрибутов заметок к данным, примененным к свойствам модели. Generates HTML5 validation attributes from data annotation attributes applied to model properties

Располагает перекрытием вспомогательного метода HTML с Html.TextBoxFor и Html.EditorFor . Has an HTML Helper feature overlap with Html.TextBoxFor and Html.EditorFor . Дополнительные сведения см. в разделе Альтернативы вспомогательного метода HTML вспомогательной функции тега входных данных. See the HTML Helper alternatives to Input Tag Helper section for details.

Обеспечивает строгую типизацию. Provides strong typing. Если после изменения имени свойства не выполнить обновление вспомогательной функции тега, возникнет ошибка следующего вида: If the name of the property changes and you don’t update the Tag Helper you’ll get an error similar to the following:

Вспомогательная функция тега Input задает атрибут HTML type на основе типа .NET. The Input Tag Helper sets the HTML type attribute based on the .NET type. В следующей таблице перечислены некоторые распространенные типы .NET и созданный тип HTML (указаны не все типы .NET). The following table lists some common .NET types and generated HTML type (not every .NET type is listed).

Тип .NET .NET type Тип входных данных Input Type
Bool Bool type=»checkbox» type=»checkbox»
String String type=»text» type=»text»
DateTime DateTime type=»datetime-local» type=»datetime-local»
Byte Byte type=»number» type=»number»
Int Int type=»number» type=»number»
Single, Double Single, Double type=»number» type=»number»

В следующей таблице приведены некоторые наиболее распространенные атрибуты заметок к данным, которые вспомогательная функция тега входных данных будет сопоставлять с определенными типами входных данных (указаны не все атрибуты проверки): The following table shows some common data annotations attributes that the input tag helper will map to specific input types (not every validation attribute is listed):

Атрибут Attribute Тип входных данных Input Type
[EmailAddress] [EmailAddress] type=»email» type=»email»
[Url] [Url] type=»url» type=»url»
[HiddenInput] [HiddenInput] type=»hidden» type=»hidden»
[Phone] [Phone] type=»tel» type=»tel»
[DataType(DataType.Password)] [DataType(DataType.Password)] type=»password» type=»password»
[DataType(DataType.Date)] [DataType(DataType.Date)] type=»date» type=»date»
[DataType(DataType.Time)] [DataType(DataType.Time)] type=»time» type=»time»

Приведенный выше код создает следующий HTML: The code above generates the following HTML:

Заметки данных применяются к свойствам Email и Password , создающим метаданные для модели. The data annotations applied to the Email and Password properties generate metadata on the model. Вспомогательная функция тега входных данных использует метаданные модели и создает атрибуты data-val-* HTML5 (см. статью о проверке модели). The Input Tag Helper consumes the model metadata and produces HTML5 data-val-* attributes (see Model Validation). Эти атрибуты описывают проверяющие элементы управления, присоединяемые к полям входных данных. These attributes describe the validators to attach to the input fields. Это обеспечивает ненавязчивую проверку HTML5 и jQuery. This provides unobtrusive HTML5 and jQuery validation. Ненавязчивые атрибуты имеют формат data-val-rule=»Error Message» , где правило — это имя правила проверки (например, data-val-required , data-val-email , data-val-maxlength и т. д.). Если в атрибуте приводится сообщение об ошибке, оно отображается как значение атрибута data-val-rule . The unobtrusive attributes have the format data-val-rule=»Error Message» , where rule is the name of the validation rule (such as data-val-required , data-val-email , data-val-maxlength , etc.) If an error message is provided in the attribute, it’s displayed as the value for the data-val-rule attribute. Также существуют атрибуты формы data-val-ruleName-argumentName=»argumentValue» , которые содержат дополнительные сведения о правиле, например data-val-maxlength-max=»1024″ . There are also attributes of the form data-val-ruleName-argumentName=»argumentValue» that provide additional details about the rule, for example, data-val-maxlength-max=»1024″ .

Альтернативы вспомогательного метода HTML вспомогательной функции тега входных данных HTML Helper alternatives to Input Tag Helper

Html.TextBox , Html.TextBoxFor , Html.Editor и Html.EditorFor имеют функции, перекрывающиеся со вспомогательной функцией тега входных данных. Html.TextBox , Html.TextBoxFor , Html.Editor and Html.EditorFor have overlapping features with the Input Tag Helper. Вспомогательная функция тега входных данных будет автоматически задавать атрибут type , а Html.TextBox и Html.TextBoxFor — нет. The Input Tag Helper will automatically set the type attribute; Html.TextBox and Html.TextBoxFor won’t. Html.Editor и Html.EditorFor обрабатывают коллекции, сложные объекты и шаблоны, а вспомогательная функция тега входных данных не делает этого. Html.Editor and Html.EditorFor handle collections, complex objects and templates; the Input Tag Helper doesn’t. Вспомогательная функция тега входных данных, Html.EditorFor и Html.TextBoxFor являются строго типизированными (они используют лямбда-выражения); а Html.TextBox и Html.Editor не являются таковыми (они используют имена выражений). The Input Tag Helper, Html.EditorFor and Html.TextBoxFor are strongly typed (they use lambda expressions); Html.TextBox and Html.Editor are not (they use expression names).

HtmlAttributes HtmlAttributes

При выполнении шаблонов по умолчанию @Html.Editor() и @Html.EditorFor() используют специальную запись ViewDataDictionary с именем htmlAttributes . @Html.Editor() and @Html.EditorFor() use a special ViewDataDictionary entry named htmlAttributes when executing their default templates. Это поведение дополняется параметрами additionalViewData . This behavior is optionally augmented using additionalViewData parameters. Ключ «htmlAttributes» не учитывает регистр. The key «htmlAttributes» is case-insensitive. Ключ «htmlAttributes» обрабатывается так же, как htmlAttributes объект, передаваемый во вспомогательные функции входных данных, такие как @Html.TextBox() . The key «htmlAttributes» is handled similarly to the htmlAttributes object passed to input helpers like @Html.TextBox() .

Имена выражений Expression names

Значением атрибута asp-for является ModelExpression и правая часть лямбда-выражения. The asp-for attribute value is a ModelExpression and the right hand side of a lambda expression. Таким образом, asp-for=»Property1″ становится m => m.Property1 в созданном коде, поэтому нет необходимости добавлять префикс Model . Therefore, asp-for=»Property1″ becomes m => m.Property1 in the generated code which is why you don’t need to prefix with Model . Чтобы начать встроенное выражение и переместить его перед m. , используется символ @. You can use the «@» character to start an inline expression and move before the m. :

Выводится следующий результат: Generates the following:

При использовании свойств коллекции asp-for=»CollectionProperty[23].Member» генерирует то же самое имя, что и asp-for=»CollectionProperty[i].Member» , если i имеет значение 23 . With collection properties, asp-for=»CollectionProperty[23].Member» generates the same name as asp-for=»CollectionProperty[i].Member» when i has the value 23 .

Когда MVC ASP.NET Core рассчитывает значение ModelExpression , он оценивает несколько источников, включая ModelState . When ASP.NET Core MVC calculates the value of ModelExpression , it inspects several sources, including ModelState . Вы можете использовать . Consider . Рассчитанный атрибут value является первым значением, отличным от NULL, из: The calculated value attribute is the first non-null value from:

  • записи ModelState с ключом «Name»; ModelState entry with key «Name».
  • результата выражения Model.Name . Result of the expression Model.Name .

Для перехода к дочерним свойствам можно также использовать путь к свойству модели представления. You can also navigate to child properties using the property path of the view model. Рассмотрим более сложный класс модели, который содержит дочернее свойство Address . Consider a more complex model class that contains a child Address property.

В представлении выполняется привязка к Address.AddressLine1 : In the view, we bind to Address.AddressLine1 :

Следующий HTML создан для Address.AddressLine1 : The following HTML is generated for Address.AddressLine1 :

Имена выражений и коллекций Expression names and Collections

Пример модели, содержащей массив Colors : Sample, a model containing an array of Colors :

Метод действия: The action method:

В следующем коде Razor показано получение доступа к определенному элементу Color : The following Razor shows how you access a specific Color element:

Шаблон Views/Shared/EditorTemplates/String.cshtml: The Views/Shared/EditorTemplates/String.cshtml template:

Пример с использованием List : Sample using List :

В следующем коде Razor показана итерация по коллекции: The following Razor shows how to iterate over a collection:

Шаблон Views/Shared/EditorTemplates/ToDoItem.cshtml: The Views/Shared/EditorTemplates/ToDoItem.cshtml template:

По возможности следует использовать foreach , когда значение будет применяться в эквивалентном контексте asp-for или Html.DisplayFor . foreach should be used if possible when the value is going to be used in an asp-for or Html.DisplayFor equivalent context. Обычно лучше использовать for , чем foreach (если сценарий позволяет), так как ему не нужно выделять перечислитель. Тем не менее оценка индексатора в выражении LINQ может быть недешевой, поэтому ее нужно минимизировать. In general, for is better than foreach (if the scenario allows it) because it doesn’t need to allocate an enumerator; however, evaluating an indexer in a LINQ expression can be expensive and should be minimized.

В приведенном выше комментированном коде показано, как заменить лямбда-выражение оператором @ , чтобы получить доступ к каждому ToDoItem в списке. The commented sample code above shows how you would replace the lambda expression with the @ operator to access each ToDoItem in the list.

Вспомогательная функция тега Textarea The Textarea Tag Helper

Вспомогательная функция тега Textarea Tag Helper аналогична вспомогательной функции тега входных данных. The Textarea Tag Helper tag helper is similar to the Input Tag Helper.

Создает атрибуты id и name , а также атрибуты проверки данных из модели для элемента

Обеспечивает строгую типизацию. Provides strong typing.

Располагает альтернативой вспомогательному методу HTML — Html.TextAreaFor . HTML Helper alternative: Html.TextAreaFor

Создается следующий HTML: The following HTML is generated:

Вспомогательная функция тега метки The Label Tag Helper

Позволяет создать заголовок метки и атрибут for в элементе для имени выражения. Generates the label caption and for attribute on a element for an expression name

Располагает альтернативой вспомогательному методу HTML — Html.LabelFor . HTML Helper alternative: Html.LabelFor .

Label Tag Helper предоставляет следующие преимущества по сравнению с чистым элементом метки: The Label Tag Helper provides the following benefits over a pure HTML label element:

Вы автоматически получаете значение описательной метки из Display атрибута. You automatically get the descriptive label value from the Display attribute. Предполагаемое отображаемое имя может изменяться с течением времени, а сочетание атрибута Display и вспомогательной функции тега метки будет применять атрибут Display везде, где он используется. The intended display name might change over time, and the combination of Display attribute and Label Tag Helper will apply the Display everywhere it’s used.

Меньше разметки в исходном коде. Less markup in source code

Строгая типизация со свойством модели. Strong typing with the model property.

Для элемента создан следующий HTML: The following HTML is generated for the element:

Вспомогательная функция тега метки сгенерировала для атрибута for значение «Email», представляющее собой идентификатор, связанный с элементом . The Label Tag Helper generated the for attribute value of «Email», which is the ID associated with the element. Вспомогательные функции тегов создают согласованные элементы id и for , чтобы обеспечить их правильное связывание. The Tag Helpers generate consistent id and for elements so they can be correctly associated. Заголовок в этом примере взят из атрибута Display . The caption in this sample comes from the Display attribute. Если модель не содержит атрибут Display , заголовком будет имя свойства выражения. If the model didn’t contain a Display attribute, the caption would be the property name of the expression.

Вспомогательные функции тегов проверки The Validation Tag Helpers

Существует две вспомогательные функции тегов проверки. There are two Validation Tag Helpers. Validation Message Tag Helper отображает сообщение проверки для одного свойства в модели, Validation Summary Tag Helper отображает сводку ошибок проверки. The Validation Message Tag Helper (which displays a validation message for a single property on your model), and the Validation Summary Tag Helper (which displays a summary of validation errors). Input Tag Helper добавляет клиентские атрибуты проверки HTML5 в элементы входных данных на основе атрибутов заметок к данным в классах модели. The Input Tag Helper adds HTML5 client side validation attributes to input elements based on data annotation attributes on your model classes. Проверка также выполняется на сервере. Validation is also performed on the server. Вспомогательная функция тега проверки отображает эти сообщения об ошибках при возникновении ошибки проверки. The Validation Tag Helper displays these error messages when a validation error occurs.

Вспомогательная функция тега сообщения о проверке The Validation Message Tag Helper

Добавляет атрибут data-valmsg-for=»property» HTML5 в элемент span, который присоединяет сообщения об ошибках проверки к полю входных данных указанного свойства модели. Adds the HTML5 data-valmsg-for=»property» attribute to the span element, which attaches the validation error messages on the input field of the specified model property. При возникновении ошибки проверки на стороне клиента jQuery отображает сообщение об ошибке в элементе . When a client side validation error occurs, jQuery displays the error message in the element.

Проверка также выполняется на сервере. Validation also takes place on the server. На клиентах может быть отключена поддержка JavaScript, поэтому некоторые проверки выполняются только на стороне сервера. Clients may have JavaScript disabled and some validation can only be done on the server side.

Располагает альтернативой вспомогательному методу HTML — Html.ValidationMessageFor . HTML Helper alternative: Html.ValidationMessageFor

Validation Message Tag Helper используется с атрибутом asp-validation-for в элементе HTML span. The Validation Message Tag Helper is used with the asp-validation-for attribute on a HTML span element.

Вспомогательная функция тега сообщения о проверке создает следующий HTML: The Validation Message Tag Helper will generate the following HTML:

Как правило, Validation Message Tag Helper используется после вспомогательной функции тега Input для одного и того же свойства. You generally use the Validation Message Tag Helper after an Input Tag Helper for the same property. В этом случае сообщения об ошибках проверки отображаются рядом с входными данными, вызвавшими ошибку. Doing so displays any validation error messages near the input that caused the error.

Для проверки на стороне клиента необходимо иметь представление с правильными ссылками на скрипты JavaScript и jQuery. You must have a view with the correct JavaScript and jQuery script references in place for client side validation. Дополнительные сведения см. в статье о проверке модели. See Model Validation for more information.

При возникновении ошибки проверки на стороне сервера (например, если выполняется пользовательская проверка на стороне сервера или проверка на стороне клиент отключена) MVC размещает сообщение об ошибке в тексте элемента . When a server side validation error occurs (for example when you have custom server side validation or client-side validation is disabled), MVC places that error message as the body of the element.

Вспомогательная функция тега сводки по проверке The Validation Summary Tag Helper

Работает с элементами

Располагает альтернативой вспомогательному методу HTML — @Html.ValidationSummary . HTML Helper alternative: @Html.ValidationSummary

Validation Summary Tag Helper используется для отображения сводки по сообщениям проверки. The Validation Summary Tag Helper is used to display a summary of validation messages. Значением атрибута asp-validation-summary может быть любое из следующих: The asp-validation-summary attribute value can be any of the following:

asp-validation-summary asp-validation-summary Отображаемые сообщения о проверке Validation messages displayed
ValidationSummary.All ValidationSummary.All Свойство и уровень модели Property and model level
ValidationSummary.ModelOnly ValidationSummary.ModelOnly Модель Model
ValidationSummary.None ValidationSummary.None Нет None

Пример Sample

В следующем примере модель данных дополнена атрибутами DataAnnotation , в результате чего создаются сообщения об ошибках проверки для элемента . In the following example, the data model is decorated with DataAnnotation attributes, which generates validation error messages on the element. При возникновении ошибки проверки вспомогательная функция тега проверки отображает следующее сообщение об ошибке: When a validation error occurs, the Validation Tag Helper displays the error message:

Созданный HTML (если модель является допустимой): The generated HTML (when the model is valid):

Вспомогательная функция тега Select The Select Tag Helper

Создает элемент select и связанные элементы option для свойств модели. Generates select and associated option elements for properties of your model.

Располагает альтернативой вспомогательному методу HTML — Html.DropDownListFor и Html.ListBoxFor . Has an HTML Helper alternative Html.DropDownListFor and Html.ListBoxFor

Select Tag Helper asp-for указывает имя свойства модели для элемента select, а asp-items указывает элементы option. The Select Tag Helper asp-for specifies the model property name for the select element and asp-items specifies the option elements. Например: For example:

Привязка перечисления Enum binding

Часто бывает удобно использовать

Добавление элементов HTML не ограничивается параметром No selection (Не выбрано). Adding HTML elements isn’t limited to the No selection case. Например, следующее представление и метод действия создадут HTML, аналогичный приведенному выше коду: For example, the following view and action method will generate HTML similar to the code above:

В зависимости от текущего значения Country будет выбран соответствующий элемент (содержащий атрибут selected=»selected» ). The correct element will be selected ( contain the selected=»selected» attribute) depending on the current Country value.

AJAX Пример ASP

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

Пример AJAX ASP

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

Пример

Начните вводить имя в поле ввода ниже:

Пример объяснено

В приведенном выше примере, когда пользователь вводит символ в поле ввода, выполняется функция с именем «шовхинт ()».

Функция запускается событием OnKeyUp.

Пример

Start typing a name in the input field below:

Asp примеры 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 MVC

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

Что мне понравилось в ASP .NET MVC

Моя основная работа никогда не была напрямую связана с web-разработкой. Все проекты создавались в свободное время и на технологиях, которые были мне симпатичны. Изначально мой выбор (как и у многих) пал в сторону PHP. Я долго на нем писал код, постоянно закрывая глаза на его странности и проблемы. Мне нравились многие PHP-фреймворки (Kohana, CodeIgniter, FuelPHP и т.д.) и с удовольствием применял их в своих проектах. Однако, несмотря на плюсы и многообразие готовых каркасов мне всегда хотелось переметнуться в другой лагерь и посмотреть, как происходит процесс разработки аналогичных вещей там. Сначала я присматривался к популярному Ruby с его рельсами, но потом все же решил остановиться на .NET. Перечислять плюсы данной платформы можно долго, но наиболее значимыми для меня все же стали:

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

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

  • Инструменты. Visual Studio – прекрасная IDE, а в купе с такими вещами как ReSharper и вовсе превращается в настоящий комбайн для разработчиков. Все необходимое собрано под одной оболочкой: полноценный отладчик, средства для рефакторинга, IntelliSense, оснастки для связи со вспомогательными технологиями и многое другое. Все компоненты работают шустро и мотивируют на плодотворную работу.
  • Полная документация. Технические документы по технологиям Microsoft оперативно обновляются и содержат массу полезной информации, начиная от теории, заканчивая полноценными примерами. Я уже не говорю о ежегодных подборках бесплатных тренингов в виде скринкастов и других няшек вроде сильного и отзывчивого комьюнити.
  • Производительность. Сравнивать производительность двух похожих технологий всегда интересно, на зачастую такие сравнения не совсем объективны. В больших проектах и командной разработке ASP .NET показывает класс и далеко оставляет многих оппонентов. Скорость исполнения кода, за счет компиляции, во многих случаях в быстрее, чем в интерпретируемых языках.
  • Безопасность. Не буду говорить, что это ключевое требование для каждого современного проекта. В ASP .NET все нацелено на создание безопасного кода. С одной стороны тебя страхует компилятор (от «детских» болезней), а с другой всевозможные библиотеки и готовые механизмы (например, безопасная система аутентификации).
  • Расширяемость. Выходя за рамки типовых проектов, всегда возникает задача расширяемости. Если библиотека/технология не поддерживает возможность масштабирования, то нужно трижды подумать, перед тем как начать строить на ее основе долгоиграющий проект. Реализация MVC фреймворка от Microsoft достаточно хорошо продумана и проблемы с наращиванием функционала вряд ли возникнут. Разработчик всегда может написать реализацию отдельного компонента системы, тем самым снабдив его необходимым функционалом.
  • Хозяин своему коду. Я люблю полностью контролировать свой код, и мне дико не нравится, когда система генерит его без моего ведома. В классическом ASP .NET одной из проблем всегда была бесконтрольная верстка. Платформа так и норовила сформировать невалидный код разметки, который трудно переделать под себя. В ASP .NET MVC такая проблема отсутствует напрочь. Здесь программист сам командует парадом.

    Model View Controller

    На страницах нашего журнала я уже несколько раз рассматривал Архитектурный паттерн MVC (модель, представление, контроллер). В одном из номеров я даже приводил пример разработки простейшего MVC фреймворка на PHP. Паттерн MVC условно делит архитектуру приложения на три компонента:

  • модель (model) – определяет основные сущности приложения. Звучит заумно, но под этой фразой всего лишь подразумеваются алгоритмы/классы, необходимые для доступа к данным. Например, мы собираемся делать многопользовательское приложение. Класс, описывающий объект пользователя будет являться моделью.
  • представление (view) – визуализация моделей. На примере web-приложений это будет HTML верстка.
  • контроллер (controller) – отвечает за обработку поступающих запросов.

    Главная цель MVC – обеспечить разделение ответственности между основными компонентами приложения. Контроллер ничего не должен знать о нюансах формирования верстки или хранению данных в БД, а выполнять лишь роль проводника. Пользователь попросил, а контроль нашел правильный путь, не задумываясь о том, что там может произойти.

    Багтрекер

    Типичный пример при знакомстве с подобными фреймворками – создание еще одного движка для блога. Я сначала хотел пойти тем же путем, но в итоге решил придумать более полезное приложение. Так родилась идея проверить фреймворка на создании проекта «Багтрекер». Такие приложения наиболее востребованы в компаниях, где более-менее налажен процесс разработки и совсем скоро ты убедишься, что сотворить нечто подобное на ASP .NET MVC пуще простого.

    Теперь давай определимся с функционалом будущего проекта. Будущий багтрекер должен:

  • отображать список тикетов с возможностью быстрой фильтрации по их состоянию (открыто/закрыто);
  • обладать простым интерфейсом, упрощающий процесс добавления задач в базу;
  • производить эстетичное впечатление на пользователя;

    С первыми двумя пунктами все ясно – немного кода на C# и все готово, но как быть с интерфейсом? Мы воспользуемся фреймворком TwitterBootstrap, который позволит нам состряпать симпатичный интерфейс для приложения за несколько минут. Я не стану приводить портянку из пары десятков килобайт HTML кода, а просто дам ссылку на готовую заготовку http://goo.gl/Xvhsmh. Качай и повторяй действия вместе со мной.

    Делаем проект

    У меня нет профессиональной версии студии, поэтому я воспользовался экспресс версией редакции «Для web». Запускай студию и создавай новый проект «Веб-приложение ASP .NET 4». С гордым названием BugTrackerForX.

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

    Для своего проекта мы выберем вариант «Простой». Такой прожект не будет включать в себя ничего лишнего и это будет в самый раз для первого знакомства с миром ASP .NET MVC. В окне выбора шаблона для приложения также обрати внимание на пункт «View Engine». Здесь выбирается шаблонизатор для представлений. Тебе доступно два варианта: Razor и ASPX.

    Во второй версии фреймворка MVC в качестве шаблонизатора использовался ASPX, пришедший из классического ASP .NET. После PHP’ного многообразия движков для рендеринга представлений начинаешь испытывать приступы тошноты от его неуклюжести. Лучше сразу выбирать Razor, максимально приближенный к аналогичным PHP-решениям (Smarty, Twig и т.д.).

    Больше никаких галок ставить не нужно, жми «OK» и студия сгенерирует болванку приложения.

    Структура MVC приложения

    Открой окно «Solution Explorer» по шире и мотай теорию на ус.

  • App_Data. После создания приложения эта директория пуста, но впоследствии в ней будут храниться различные ресурсы приложения, такие как базы данных.
  • App_Start. В директории принято хранить статичные классы, отвечающие за общую конфигурацию приложения. В предыдущих версиях фреймворка классы, влияющие на конфигурацию приложения, описывались в едином файле «Global.asax». Начиная с 4-й версии принято их разделять на отдельные файлы и помещать в App_Start с кодом инициализации в Global.asax.
  • Content. Статичные ресурсы приложения. Сюда можно помещать изображения, файлы стилей и много чего другого.
  • Controllers. Из названия сразу понятно, что здесь должны храниться все контроллеры.
  • Models. Содержит описание моделей приложения.
  • Scripts. Здесь должны находиться различные вспомогательные библиотеки. Как правило, это JavaScript тулзы вроде Angular.JS, jQuery и т.д. При создании приложения по шаблону «Простой» в эту папку автоматически добавляется ряд библиотек: jQuery, jQuery UI, knockout, modernizr и т.д.
  • Views. Название директории опять подсказывает тип содержимого. Все представления группируются по принадлежности к контроллерам. Например, все представления, относящиеся к контроллеру “Home” будут размещаться по пути «Views/Home/».
  • Global.asax – о предназначении этого файла я упоминал, когда рассказывал про директорию «App_Start». Напоминаю еще раз, в файле определяется код инициализации проекта.
  • Web.config – основной файл конфигурации приложения. Например, здесь описываются настройки соединения с СУБД; настройки вспомогательных компонент (таких как Entity Framework).

    Выжигаем модели

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

  • Тикет (Ticket) – сущность, характеризующая отдельную заявку (пост в баг трекер). Ряд полей этой модели будет ссылаться на другие модели;
  • Статус (Status) – статус выполнения заявки;
  • Категория (Category) – категория заявки;
  • Пользователь (User) – пользователь, оставивший тикет;

    Каждая модель в ASP .NET MVC фреймворке описывается в виде отдельного класса в папке Model (можно в любом месте). Добавление новые моделей выполняется в контекстном меню с помощью пункта «Add» -> «Class». Создай все выше озвученные модели (см. соответствующие листинги) и возвращайся к тексту статьи.

    Листинг 1. Описание модели Category

    Листинг 2. Описание модели Status

    Листинг 3. Описание модели Ticket

    Листинг 4. Описание модели User

    Подключаем Entity Framework

    Платформа .NET предоставляет нам несколько способов доступа к данным. Мы воспользуемся наиболее актуальным из них – Entity Framework. Помимо типичных задач, возлагающих на ORM (Object relation mapping) фреймворк, в EF реализована поддержка методики CodeFirst, позволяющая девелоперу на этапе разработки не задумываться о дизайне схемы БД. Достаточно лишь описать модели, а вопросы создания базы и таблиц на себя возьмет сам фреймворк. Нельзя сказать, что такая схема будет готова к использованию в продакшене, однако, при разработке приложения с нуля такой подход позволит существенно сэкономить время.

    Чтобы воспользоваться плюсами этого фреймворка, нам необходимо подключить его к своему проекту. Проще всего это сделать при помощи консоли управления пакетами NuGet. Сразу после инсталяции Visual Studio for Web расширение Nuget Package Manager недоступно. Его требуется установить самостоятельно, воспользовавшись пунктом «Extensions and Update» в меню «Service». После установки запускай «Nuget Package Manager Console» и вводи в ней команду для установки Entity Framework: «Install-Package EntityFramework».

    Установив Entity Framework, мы можем создать контекст данных для наших моделей и начать производить первые манипуляции с добавленными в БД записями. Под страшным словом «контекст» подразумевается создание класса наследника от DbContext (System.Data.Entity), который свяжет модели с таблицами базы данных. Создавай новый класс для контекста данных в директории «Models» и переписывай в него код листинга 5.

    Листинг 5. Реализация класса контекста

    После создания контекста мы можем воспользоваться технологией CodeFirst, т.е. доверить EntityFramework создание таблиц и полей. В своем примере я воспользуюсь именно этим способом, т.к. статья не резиновая и тратить время на описание процесса создания схемы БД нет смысла. К тому же ничего не мешает тебе самостоятельно создать БД (ради эксперимента) и познакомиться с подходом DatabaseFirst (сначала база, потом код).

    В принципе, уже на данном этапе мы можем создать контроллер с представлениями, и EF любезно сгенерирует базу данных. Однако, мы лучше сразу внесем небольшой твик в конфигурационный файл (Web.config), тем самым принудительно зададим имя базы. Найди в этом файле описание секции «ConnectionStrings» и удали из нее (если есть) все разделы. После добавь одну строку:

    В этой строке я определил, что фреймворк должен использовать BugTrackerContext для связи с БД, а саму базу будет хранить в файле ourBase.mdf, расположенный в директории данных (App_Data) проекта.

    CRUD приложение в пару кликов

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

    Создадим для этого простейший CRUD (Create read update delete) функционал без единой строчки кода. Переходи в «Solution Explorer» и добавь в папку «Controllers» новый контроллер с именем «CrudController». В окне создания нового контроллера не торопись кликать на пимпу с кнопкой «OK». В выпадающем поле «Template» выбери «MVC controller with read/write actions and views, using Entity Framework». После этого станут доступны поля для выбора классов, описывающих модель и контекст данных. Выбирай Ticket (в качестве модели) и BugTrackerContext (в качестве контекста). Остальные поля можешь оставить со значениями по умолчанию.

    Нажимай на пимпу «Ok» и восхищайся, как студия создала за нас код действий с необходимыми представлениями. Нам остается только запустить приложение и проверить результат его выполнения. Сразу предупреждаю, после запуска ты увидишь не результат работы CRUD, а ошибку «Ресурс не найден». Мы не прописали маршрут по умолчанию, поэтому чтобы добраться до сгенерированного контроллера тебе потребуется вбить в адресной строке полный путь к нему: http://localhost:53532/crud. Альтернативным решением будет внесение изменений в конфигурацию маршрута (файл RouteConfig.cs):

    В этой строке я устанавливаю, что контроллером по умолчанию является crud (а не Home, как было изначально). Внеся изменения в маршрут – перезапусти приложение, и ты сразу попадешь в сгенерированный CRUD интерфейс.

    Во время создания тикета ты увидишь, что фреймворк сгенерировал нам выпадающие списки для полей «Category», «Status» и «User», но в этих списках нет ни одного элемента для выбора. Чтобы в них что-то появилось нам нужно добавить данные в соответствующие таблицы. Прерви выполнение аппликации и через окно «DatabaseExplorer» открой соответствующие таблицы для внесения данных. Я создал пару статусов в таблице «Statuses» и парочку разделов в «Categories», после этого выпадающие поля в представлении заполнились добавленными данными.

    CRUD-приложение получилось вполне рабочим, но для постоянного использования оно не годится. Уж больно смотрится «топорно» и не функционально. У нас уже есть забутстрапенная заготовка верстки, и теперь остается ее натянуть на существующее приложение, а заодно познакомиться с самостоятельным созданием контроллеров и представлений.

    Добавляй новый пустой контроллер к своему проекту и назови его «HomeController». Visual Studio сгенерирует каркас будущего контроллера и создаст действие «Index». Это действие будет выполняться во время обращение к имени контроллера. Например, чтобы обратится к нашему контроллеру «Home», нам требуется перейти по адресу: http://localhost/home.

    Пока ты переписываешь код контроллера, я расскажу тебе о реализации контроллеров в ASP .NET MVC. Как ты уже понял из листинга, контроллер – это не что иное, как обычный класс, унаследованный от System.Web.Mvc.Controller. При создании нового контроллера ты должен следовать некоторым соглашениям. Главным, из которых будет обязательное наличие постфикса «Controller». Например, если ты хочешь создать контроллер «Adminka», то в этом случае полное имя должно быть «AdminkaController».

    Чтобы обратится к созданному контроллеру (из браузера) необходимо написать в адресной строке полное имя контроллера и через слэш имя действия. Если требуется передать в контроллер какие-нибудь дополнительные параметры (например, методом Get), то их также следует указывать через слеш. Такой подход справедлив для маршрута, определенного по умолчанию. Например, для передачи параметра «1» контроллеру «adminka» следует пройти по пути: «http://localhost/adminka/1». Обрати внимание, что в браузере указать постфикс «Controller» не требуется.

    Листинг 6. Код контроллера

    У тебя может возникнуть резонный вопрос: «Возможно ли, как-то повлиять на установленные правила роутинга?». Шаблон маршрута определен в классе RouteConfig и ты волен им рулить как хочешь. Например: » ru// » заставит добавлять к имени контроллера префикс «ru».

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

    Дизайним представление

    Контроллер успешно принимает пользовательские запросы, и теперь пора сотворить для него представление. Добавить для контроллера новое представление. Проще всего это сделать посредством пункта «Add View» контекстного меню, вызываемого при правом клике по имени действия контроллера.

    В ASP .NET MVC принято выделять несколько типов представлений:

  • Строго типизированные представления (мы должны гарантировать, что переданная модель будет заданного типа);
  • Частичные представления (используются внутри других представлений);
  • Мастер-страницы (представления, позволяющие задать шаблон формирования страниц);

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

    Мастер страницы принято помещать в директорию «Shared». Для своего примера я определил одно представление и назвал его _bugTrackerMasterPage.cshtml (содержит основную часть верстки). Приводить код вьюшки я не буду причине ее объема, а лучше сразу рассмотрю используемые управляющие конструкции:

  • Html.Partial(“_leftSidebar”) –вызов частичного представления с именем «_leftSiderbat». В одноименном файле я описал код верстки левого сайдбара.
  • RenderBody() – запускает рендеринг других представлений, созданных на основе данной мастер-страницы;
  • Url.Content(«/home/createEntry») – хелпер формирует абсолютный путь к приложению;
  • Scripts.Render(«assets/js/jquery.js») – хелпер генерирует теги для подключения JavaScript и прописывает в атрибут src путь сценарию;

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

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

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

    Теперь посмотрим на код представления Index. В вьюшке формируется список имеющихся в базе тикетов. Выборка самих данных происходит в контроллере и список с ними передается в представление:

    Запрос к таблицам БД выполняется не напрямую, а через Entity Framework. Поскольку модель «Ticket» содержит ссылки на другие модели, то мы должны включить их в запрос (метод Include()). Сформированная выборка передается в качестве параметра соответствующему представлению.

    Вывод данных из модели в самом представлении осуществляется в стандартном цикле:

    Здесь я перебираю записи из Model, которую предварительно объявили в самом начале файла представления:

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

    Dispose

    Разрабатывать WEB-приложения под платформу ASP.NET благодаря фреймворку ASP .NET стало значительно проще. Рассмотренный в статье пример лишнее тому подтверждение. Я не хочу сказать, что ASP .NET – это золотой костыль или серебряная пуля web-строителя. Это очередная технология, которую нужно уметь применять и получать выгоду. Мир на PHP, пусть даже с его многообразием самых разных фреймворков однозначно не заканчивается. Не стесняйся пробовать альтернативные технологии, не засиживайся в одной, пусть даже самой комфортной среде. Сравнивай технологии и выбирай из них наиболее оптимальную для конкретной задачи. На этом у меня все.

    Стоит ли изучать классический ASP .NET?

    Простота MVC фреймворка для ASP .NET может запросто создать ошибочное мнение. Мол, на фиг этот «неповоротливый» ASP .NET с его «странной» разметкой, мне хватит и ASP .NET MVC. Не стоит забывать, что MVC это всего лишь архитектурный паттерн и его можно реализовать самостоятельно на любом языке. Тут ситуация аналогична миру PHP. С момента появления mvc-фреймворков язык получил второе дыхание и сумел привлечь новых поклонников. Почему? Порог вхождения и в без того простой язык программирования снизился. Многие вещи стали доступны из коробки.

    В мире ASP .NET произошла аналогичная ситуация. MVC фреймворк от Microsoft существенно понизил барьер вхождения в технологию ASP .NET,. Правда это не говорит, что без фреймворка платформа никуда не годится. Просто запомни, что фреймворк это лишь очередной слой, скрывающий от твоего взора ряд нюансов классического ASP .NET. Имея достаточный уровень подготовки, ты без проблем можешь сделать свою реализацию MVC фреймворк под платформу ASP .NET. Он тоже сможет в три пятнадцать делать красивые урлы и осуществлять контроль на генерируемой разметкой. К чему это я все говорю? А к тому, что технология ASP .NET намного шире, чем просто ASP .NET MVC. Ее глубокому изучения однозначно стоит уделить время и только тогда ты сможешь по-настоящему прочувствовать всю платформы от Microsoft, которая так полюбилась в корпоративном сегменте.

    Топ 5 мифов об ASP .NET/ASP .NET MVC

    — «А под unix-like это не заведется!». Еще как заведется. Достаточно немного почитать о проекте Mono (http://goo.gl/dS3v), а потом статью «Установка ASP .NET на Linux (nginx+mono+xsp) с Хабра (http://goo.gl/rPJbX) и миф сразу развеется в дымке;

    — «Это же жутко дорого, надо много $$$». Опять неправда. Можно воспользоваться Express версии Visual Studio for Web (именно ее я использовал при написании статьи) или какой-нибудь альтернативной средой (все верно, здесь сплошная демократия). Остальные компоненты (например, SQL Server) также доступны в бесплатных вариантах. Кроме того, Microsoft регулярно проводит всяческие акции/скидки, позволяющие получить полноценный версии продуктов либо совсем бесплатно, либо с существенной скидкой.

    — «Microsoft делает дырявый софт». Ну да, и это не мешает им богатеть и завоевывать новые рынки. Если серьезно, продукты Microsoft в большинстве случаев намного безопасней, чем OpenSource альтернативы. Проверить это не трудно. Заходим на баг трекер и смотрим количество ошибок под IIS (как пример) и под Apache. Результаты приятно удивят.

    — «PHP приложения работают быстрей». Точно, работают. Не забывай, что код под ASP .NET будет сначала компилироваться, а только потом исполнятся. Причем именно выполнятся, а не стремиться умереть как аналогичный на PHP. Поэтому PHP если немного и побеждает, то только на фальш старте. Производительность ASP .NET хорошо показывает себя на больших проектах.

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

    Использование интерфейсов в приложении ASP.NET MVC

    Изучаю архитектуру приложений на примере asp.net mvc. Изучаю по сайту metanit. И там в примере про onion архитектуру в контроллере создаётся экземпляр интерфейса репозитория. Вот код с метанита:

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

    В чём же тогда разница?? Создавать экземпляр класса или экземпляр интерфейса. Объясните пожалуйста.

    1 ответ 1

    Для нужд вашего приложения на текущем уровне — никакой разницы. «Если это крякает как утка и плавает как утка — то это и есть утка».

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

    Одно из самых типичных применений в приложениях — для целей юнит-тестирования.

    В тесте вы создаёте контроллер, но передаёте не настоящий репозиторий, который умеет обращаться к настоящей базе — а некоторый класс, который умеет «прикидываться» для вашего контроллера репозиторием.

    Например, вы можете считать репозиторием книг нечто, умеющее отдавать список книг:

    И в проекте с тестами создать простую реализацию:

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

    И в тестах проверять методы вашего контроллера используя тестовый класс.

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

    Пример для вопроса, заданного в комментариях:

    Илон Маск рекомендует:  Trim - Функция Delphi
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL