Пример веб сайта на 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 .
Навигация по дочерним свойствам Navigating child properties
Для перехода к дочерним свойствам можно также использовать путь к свойству модели представления. 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 |
|