C# Web. Занятие 09.

Темы лекции: ASP.NET. MVC. Часть 1.
Практическое задание: ASP.NET MVC.
Тренер: Игорь Шкулипа, к.т.н.
Разработка Веб-приложений на платформе
Microsoft .NET Framework.
Занятие 9
http://www.slideshare.net/IgorShkulipa 2
Шаблон MVC
Шаблон проектирования
MVC разделяет работу
веб-приложения на три
отдельные
функциональные роли:
• модель данных
(model)
• пользовательский
интерфейс (view)
• управляющую
логику (controller)
Таким образом, изменения,
вносимые в один из
компонентов, оказывают
минимально возможное
воздействие на другие
компоненты.
http://www.slideshare.net/IgorShkulipa 3
ASP.NET MVC
ASP.NET MVC представляет собой платформу для создания сайтов и веб-
приложений с использованием паттерна (или шаблона) MVC (model -
view - controller).
• Контроллер (controller) представляет класс, с которого начинается
работа приложения. Этот класс обеспечивает связь между моделью и
представлением. Получая вводимые пользователем данные,
контроллер исходя из внутренней логики при необходимости
обращается к модели и генерирует соответствующее представление.
• Представление (view) - это визуальная часть или пользовательский
интерфейс приложения - например, html-страница, через которую
пользователь, зашедший на сайт, взаимодействует с веб-
приложением.
• Модель (model) представляет набор классов, описывающих логику
используемых данных.
http://www.slideshare.net/IgorShkulipa 4
Общая схема работы
http://www.slideshare.net/IgorShkulipa 5
ASP.NET MVC и ASP.NET Web Forms
ASP.NET MVC является в некотором роде конкурентом для традиционных веб-форм и
имеет по сравнению с ними следующие преимущества:
• Разделение ответственности. В MVC приложение состоит из трех частей:
контроллера, представления и модели, каждая из которых выполняет свои
специфичные функции. В итоге приложение будет легче поддерживать
модифицировать в будущем.
• В силу разделения ответственности приложения MVC обладают лучшей
тестируемостью. И мы можем тестировать отдельные компоненты
независимо друг от друга.
• Соответствие протоколу HTTP. Приложения MVC в отличие от веб-форм
не поддерживают объекты состояния (ViewState). Ясность и простота
платформы позволяют добиться большего контроля над работой
приложения
• Гибкость. Вы можете настраивать различные компоненты платформы по
своему усмотрению. Изменять какие-либо части конвейера работы MVC или
адаптировать его к своим нуждам и потребностям.
В то же время не стоит однозначно сбрасывать со счетов ASP.NET WebForms.
Поскольку она также имеет свои сильные стороны, например, модель событий,
которая будет ближе тем разработчикам, которые ранее занимались созданием
клиентских приложений.
http://www.slideshare.net/IgorShkulipa 6
Шаблоны приложений MVC в Visual Studio
• Internet Application. Данный шаблон представляет некоторую базовую
функциональность, например, управление учетными записями, которую будет
содержать новое приложение.
• Intranet Application. Данный шаблон похож на шаблон Internet Application.
Отличие состоит в том, что в Intranet Application для управления учетными
записями используется аутентификация Windows, а не система ASP.NET
Membership.
• Empty. Этот шаблон представляет абсолютно чистое приложение без каких-либо
файлов и структуры папок.
• Basic. Этот шаблон также представляет пустой проект. Правда, он содержит
базовые каталоги, CSS, инфраструктуру приложения MVC. Ранее в MVC 3 этот
шаблон назывался Empty.
• Mobile Application. Это новинка MVC 4, предназначенная для создания веб-
приложений для мобильных платформ.
• Web API. Предназначен для создания сервисов и для работы с фреймворком
Web API.
http://www.slideshare.net/IgorShkulipa 7
Шаблоны приложений MVC в Visual Studio
В дополнение к предыдущим проектам в обновлениях Visual Studio 2012 и
в Visual Studio 2013 были добавлены еще два типа проектов:
• Single Page Application. Шаблон, предназначенный для создания
сайтов-одностраничников.
• Facebook Application. Предназначен для создания веб-приложений
под социальную сеть Facebook.
http://www.slideshare.net/IgorShkulipa 8
Структура проекта MVC
• App_Data. В этой папке хранятся все необходимые файлы и ресурсы, например,
базы данных, используемые приложением. После развертывания приложения
только непосредственно приложение может работать с этой папкой, доступ же
простых пользователей в эту папку запрещен.
• Файл Global.asax и папка App_Start. В mvc 4 была добавлена папка
App_Start. Она включает весь функционал конфигурации приложения, который в
предыдущих версиях содержался в файле Global.asax, а теперь перенесен в
набор статичных классов, вызываемых в Global.asax. Эти статичные классы
содержат некоторую логику инициализации приложения, выполняющуюся при
запуске.
• Файл Web.config. Файл конфигурации приложения, который находится в
корневой папке приложения
• Content. Содержит некоторые вспомогательные файлы, которые не включают
код на c# или javascript, и которые развертываются вместе с приложением. В
частности, здесь могут размещаться файлы стилей css. Так, в этой папке вы
увидите файл Site.css, который содержит стили приложения, а также папку с
темами, включающую стили css и изображения для определенных тем.
• Controllers. Содержит контроллеры - классы, отвечающие за работу
приложения. По умолчанию здесь находятся два контроллера - HomeController и
AccountController.
http://www.slideshare.net/IgorShkulipa 9
Структура проекта MVC
• Папки Images и Scripts. Папки Images и Scripts содержат соответственно
изображения и скрипты на JavaScript, используемые в приложении. По
умолчанию эти папки уже содержат файлы, в частности, в папку Scripts
уже помещены файлы библиотеки jQuery.
• Models. Содержит модели, используемые приложением. По умолчанию
здесь определена одна модель - AccountModel, которая представляет
отдельную учетную запись.
• Views. Здесь размещаются представления. Представления группированы
по папкам, каждая из которых соответствует одному контроллеру. После
получения и обработки запроса контроллер, отправляет одно из этих
представлений, заполненных некоторыми данными, клиенту. Кроме того,
имеется папка общих для контроллеров представлений - папка Shared
http://www.slideshare.net/IgorShkulipa 10
Контроллеры
http://www.slideshare.net/IgorShkulipa 11
Контроллеры
Контроллер является центральным компонентом в архитектуре MVC. Контроллер
получает ввод пользователя, обрабатывает его и посылает обратно результат
обработки, например, в виде представления.
При использовании контроллеров существуют некоторые условности. Так, по
соглашениям об именовании названия контроллеров должны оканчиваться на
суффикс "Controller", остальная же часть до этого префикса считается именем
контроллера.
Чтобы обратиться контроллеру из веб-браузера, нам надо в адресной строке набрать
адрес_сайта/Имя_контроллера/. Так, по запросу адрес_сайта/Home/ система
маршрутизации по умолчанию вызовет метод Index контроллера HomeController
для обработки входящего запроса. Если мы хотим отправить запрос к
конкретному методу контроллера, то нужно указывать этот метод явно:
адрес_сайта/Имя_контроллера/Метод_контроллера, например,
адрес_сайта/Home/Buy - обращение к методу Buy контроллера HomeController.
Контроллер представляет обычный класс, который наследуется от базового класса
System.Web.Mvc.Controller. В свою очередь класс Controller реализует
абстрактный базовый класс ControllerBase, а через него и интерфейс
IController.
Таким образом, формально, чтобы создать свой класс контроллера, достаточно
создать класс, реализующий интерфейс IController и имеющий в имени
суффикс Controller.
http://www.slideshare.net/IgorShkulipa 12
Интерфейс IController
Интерфейс IController определяет один единственный метод Execute,
который отвечает за обработку контекста запроса:
public interface IController
{
void Execute(RequestContext requestContext);
}
Например:
public class MyController : IController
{
public void Execute(RequestContext requestContext)
{
string ip = requestContext.HttpContext.Request.UserHostAddress;
var response = requestContext.HttpContext.Response;
response.Write("<h2>Ваш IP-адрес: " + ip + "</h2>");
}
}
Таким образом, перейдя по пути адрес_сайта/My/, пользователь увидит
свой ip-адрес.
http://www.slideshare.net/IgorShkulipa 13
Класс Controller
Чтобы создать стандартный контроллер, можно также добавить в папку
Controllers простой класс и унаследовать от класса Controller,
например:
public class MyController : Controller
{
public ActionResult Index()
{
return View();
}
}
http://www.slideshare.net/IgorShkulipa 14
Методы действий
Методы действий (action methods) представляют такие методы
контроллера, которые обрабатывают запросы по определенному URL.
Так как запросы бывают разных типов, например, GET и POST, фреймворк
ASP.NET MVC позволяет определить тип обрабатываемого запроса для
действия, применив к нему соответствующий атрибут: [HttpGet],
[HttpPost], [HttpDelete] или [HttpPut].
Однако не все методы контроллера являются методами действий. Методы
действий всегда имеют модификатор public. Закрытых приватных
методов действий не бывает. Но контроллер может также включать и
обычные методы, которые могут использоваться в вспомогательных
целях.
[HttpGet]
public ActionResult Method(int id)
{
return View();
}
[HttpPost]
public string Method()
{
return “Bingo!";
}
http://www.slideshare.net/IgorShkulipa 15
Получение входных данных
Стандартный get-запрос может принимать примерно следующую форму:
название_ресурса?параметр1=значение1&параметр2=значение2
То есть запрос к методу мог бы выглядеть так:
Home/Method?id=2.
Название параметров метода должно совпадать с названием параметров в
строке запроса. Благодаря этому система сможет их автоматически
связать.
Кроме того, система маршрутизации позволяет создавать маршруты.
Например, по умолчанию в проекте MVC определяется следующий
маршрут:
Контроллер/Метод/id.
Последний параметр является опциональным. И благодаря этому мы
можем передать параметр id и так:
Home/Method/2
http://www.slideshare.net/IgorShkulipa 16
Получение данных из контекста запроса
Кроме того, мы можем получить параметры и другие данные, связанные с
запросом, из объектов контекста запроса.
Доступны следующие объекты контекста: Request, Response,
RoutedData, HttpContext и Server.
Объект Request содержит коллекцию Params, которая хранит все
параметры, переданные в запросы.
http://www.slideshare.net/IgorShkulipa 17
Результаты действий
Когда пользователь обращается к ресурсу, как правило, он ожидает
получить определенный ответ, например, в виде веб-страницы с
некоторыми данными. На стороне сервера метод контроллера, получая
параметры, обрабатывает их и формирует некоторый ответ в виде
результата действия.
public abstract class ActionResult
{
public abstract void ExecuteResult(ControllerContext context);
}
http://www.slideshare.net/IgorShkulipa 18
Встроенные классы, производные от ActionResult
Фрейморк ASP.NET MVC предлагает палитру классов результатов действий, которые
охватывают большинство ситуаций.
• ContentResult: пишет указанный контент напрямую в ответ в виде строки
• EmptyResult: по сути ничего не делает, отправляет пустой ответ
• FileResult: является базовым классом для всех объектов, пишущих бинарный
ответ в выходной поток. Предназначен для отправки файлов
• FileContentResult: класс, производный от FileResult, пишет в ответ массив
байтов
• FilePathResult: также производный от FileResult класс, пишет в ответ файл,
находящийся по заданному пути
• FileStreamResult: класс, производный от FileResult, пишет бинарный поток в
выходной ответ
• HttpStatusCodeResult: результат действия, который возвращает клиенту
определенный статусный код HTTP
• HttpNotFoundResult: производный от HttpStatusCodeResult. Возвращает
клиенту ответ в виде статусного кода HTTP 404, указывая, что запрошенный
ресурс не найден
http://www.slideshare.net/IgorShkulipa 19
Встроенные классы, производные от ActionResult
• HttpUnauthorizedResult: класс, производный от HttpStatusCodeResult.
Возвращает клиенту ответ в виде статусного кода HTTP 401, указывая, что
пользователь не прошел авторизацию и не имеет прав доступа к запрошенному
ресурсу.
• JavaScriptResult: возвращает в ответ в качестве содержимого код JavaScript
• JsonResult: возвращает в качестве ответа объект или набор объектов в формате
JSON
• PartialViewResult: производит рендеринг частичного представления в
выходной поток
• RedirectResult: перенаправляет пользователя по другому адресу URL,
возвращая статусный код 302 для временной переадресации или код 301 для
постоянной переадресации зависимости от того, установлен ли флаг Permanent.
• RedirectToRouteResult: класс работает подобно RedirectResult, но
перенаправляет пользователя по определенному адресу URL, указанному через
параметры маршрута
• ViewResult: производит рендеринг представления и отправляет результаты
рендеринга в виде html-страницы клиенту
http://www.slideshare.net/IgorShkulipa 20
ViewResult
Класс ViewResult является наиболее часто возвращаемым результатом
действий контроллера. Он производит рендеринг представления в веб-
страницу и возвращает ее в виде ответа клиенту.
Чтобы возвратить объект ViewResult используется метод View:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
Вызов метода View возвращает объект ViewResult. Затем уже ViewResult
производит рендеринг определенного представления в ответ. По
умолчанию контроллер производит поиск представления в проекте по
следующему пути:
/Views/Имя_контроллера/Имя_представления.cshtml
http://www.slideshare.net/IgorShkulipa 21
ViewResult
Можно также задать имя представления явным образом:
public class HomeController : Controller
{
public ViewResult SomeMethod()
{
return View("Index");
}
}
http://www.slideshare.net/IgorShkulipa 22
Переадресация
Существует два вида переадресации: временная и постоянная. И в зависимости от
вида переадресации при ее выполнении сервер посылает браузерам один из
двух кодов HTTP:
• статусный код 301 представляет постоянную переадресацию. При данном типе
переадресации предполагается, что запрашиваемый документ окончательно
перемещен в другое место. После получения данного статусного кода браузер
может автоматически настраивать запросы на новый ресурс, даже если старый
ресурс со временем перестанет применять переадресацию. Поэтому данный
способ использовать нежелательно.
• статусный код 302 представляет временную переадресацию. При временной
переадресации считается, что запрашиваемый документ временно перемещен на
другую страницу.
В обоих случаях для переадресации будет использоваться объект RedirectResult,
однако метод, возвращающий данный объект, будет отличаться.
Для временной переадресации применяется метод Redirect:
return Redirect("/Home/Index");
Для постоянной переадресации подобным образом используется метод
RedirectPermanent:
return RedirectPermanent("/Home/Index");
http://www.slideshare.net/IgorShkulipa 23
RedirectToRoute и RedirectToAction
Еще один класс для создания переадресации - RedirectToRouteResult -
позволяет выполнить более детальную настройку перенаправлений.
Он возвращается двумя методами: RedirectToAction и
RedirectToRoute.
Метод RedirectToRoute позволяет произвести перенаправление по
определенному маршруту внутри домена:
return RedirectToRoute(new { controller="Home", action="Index"});
Метод RedirectToAction позволяет перейти к определенному действию
определенного контроллера. Он также позволяет задать передаваемые
параметры:
return RedirectToAction("Square", "Home", new { a=10,h=12});
Методы RedirectToRoute и RedirectToAction представляют временную
переадресацию. Но они имеют свои двойники для создания
постоянной переадресации: RedirectToRoutePermanent и
RedirectToActionPermanent. Их действие аналогично, разница лишь
в том, что они отправляют браузеру статусный код 301.
http://www.slideshare.net/IgorShkulipa 24
Отправка ошибок и статусных кодов
Иногда возникает необходимость отправить сообщения об ошибках при
доступе к тому или иному ресурсу. Обычно, если ресурс недоступен,
MVC-фреймворк автоматически отреагирует на эту ситуацию, отправив
соответствующий статусный код.
Но в некоторых ситуациях нужно более тонко реагировать на полученный
запрос.
public ActionResult Check(int age)
{
if (age < 30)
{
return new HttpStatusCodeResult(404);
}
return View();
}
В качестве альтернативы также можно возвращать объект
HttpNotFoundResult с помощью метода HttpNotFound
http://www.slideshare.net/IgorShkulipa 25
HttpContext
Информация о запросе содержится в свойстве Request.
HttpContext.Request представляет объект класса, унаследованного
от HttpRequestBase, и поэтому содержит все его свойства.
• Получение браузера пользователя: HttpContext.Request.Browser
• Иногда просто браузера недостаточно, тогда можно обратиться к
агенту пользователя: HttpContext.Request.UserAgent
• Получение url запроса: HttpContext.Request.RawUrl
• Получение IP-адреса пользователя:
HttpContext.Request.UserHostAddress
• Чтобы получить куки, можно воспользоваться свойством
HttpContext.Request.Cookies.
http://www.slideshare.net/IgorShkulipa 26
Передача данных из контроллера в представление.
ViewData
Существует несколько способов передачи данных из контроллера в представление.
Первый из них представляет использование объекта ViewData.
ViewData представляет словарь из пар ключ-значение:
public ViewResult SomeMethod()
{
ViewData["Head"] = "Привет мир!";
return View("SomeView");
}
Тогда в представлении SomeView.cshtml мы могли бы получить передаваемую
строку следующим образом:
...
<body>
<div>
<h2>@ViewData["Head"]</h2>
</div>
</body>
</html>
http://www.slideshare.net/IgorShkulipa 27
Передача данных из контроллера в представление.
ViewBag
Еще один способ передачи данных представляет объект ViewBag. Этот объект
позволяет определить различные свойства и присвоить им любое значение.
public ViewResult SomeMethod()
{
ViewBag.Head = "Привет мир!";
return View("SomeView");
}
И таким же образом изменить представление:
...
<body>
<div>
<h2>@ViewBag.Head</h2>
</div>
</body>
</html>
И не важно, что изначально объект ViewBag не содержит никакого свойства Head,
оно определяется динамически. При этом свойства ViewBag могут содержать не
только простые объекты типа string или int, но и сложные данные.
http://www.slideshare.net/IgorShkulipa 28
Представления
http://www.slideshare.net/IgorShkulipa 29
Представления
В ASP.NET MVC 4 представления представляют файлы с расширением
cshtml/vbhtml/aspx/ascx, которые содержат код с интерфейсом
пользователя, как правило, на языке html. Стандартное представление:
@{ Layout = null;}
<!DOCTYPE html>
<html>
<head></head>
<body>
<div>
<h2>@ViewBag.Message</h2>
</div>
</body></html>
Несмотря на то, что представление в основном состоит из кода html, оно не является
html-страницей. При компиляции приложения на основе требуемого
представления сначала генерируется класс на языке C#, а затем этот класс
компилируется.
Все добавляемые представления, как правило, группируются по контроллерам в
соответствующие папки в каталоге Views. Представления, которые относятся к
методам контроллера Home, будут находиться в проекте в папке Views/Home.
Однако, при необходимости, можно создать в каталоге Views папку с
произвольным именем, где будут храниться дополнительные представления,
необязательно связанные с определенными методами контроллера.
http://www.slideshare.net/IgorShkulipa 30
Диалог создания представления
http://www.slideshare.net/IgorShkulipa 31
Параметры представлений
• View Engine - выпадающий список для выбора движка
представления. С ASP.NET MVC 4 данное диалоговое окно
поддерживает несколько движков представлений. По умолчанию здесь
представлены две возможности для выбора: Razor и ASPX. Но при
установке сторонних движков они также могут быть доступны для
выбора.
• Create a strongly-typed view - эта опция позволит создать строго
типизированное представление. После ее выбора нужно будет указать
модель в выпадающем списке, который содержит список всех моделей.
Но чтобы все модели приложения можно было использовать, перед
добавлением представления нужно скомпилировать проект.
• Scaffold template - опция позволяет выбрать шаблон формирования
нового представления.
http://www.slideshare.net/IgorShkulipa 32
Типы шаблонов представления
• Empty. Создается пустое представление. В представлении только определен тип
модели с помощью директивы @model
• Create. Создается представление с формой для создания новых объектов
модели. Генерируется метка и поле редактирования для каждого свойства
модели.
• Delete. Создается представление с формой для удаления существующих
объектов модели. Отображаются метка и текущее значение каждого свойства
модели
• И др.
• Create as a Partial View - выбор этой опции указывает, что созданное
представление будет неполным. В итоге представление будет вполне обычным,
однако в его шапке не будет таких тегов, как <html> и <head>
• Use a layout or Master Page - эта опция указывает, будут ли использоваться
мастер-страницы (главные страницы) или представление будет
самодостаточным. Для движка Razor указание мастер-страницы не является
обязательным, если вы собираетесь использовать мастер-страницу,
определенную по умолчанию в файле _ViewStart.cshtml. Однако, если вы хотите
переопределить мастер-страницу, то можете воспользоваться этой опцией.
http://www.slideshare.net/IgorShkulipa 33
Строго типизированные представления
Хотя страницы с объектом ViewBag работают как надо, но есть и другой способ,
иногда более предпочтительный, который заключается в использовании строго
типизированных представлений. Подобные представления позволяют передавать
данные не через объект ViewBag, а напрямую в представление через параметр
метода View. Код метода контроллера мог бы выглядеть так:
BookContext db = new BookContext();
public ActionResult Index()
{
return View(db.Books);
}
Теперь, чтобы связать представление с передаваемым параметром, надо добавить в
представление директиву @model с указанием типа передаваемых данных.
@model IEnumerable<BookStore.Models.Book>
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
<div>
@foreach (var b in Model)
{
<li>@b.Name</li>
}
</div>
Объект Model представляет тип модели, указанной в директиве @model, и будет
хранить переданные из контроллера данные.
http://www.slideshare.net/IgorShkulipa 34
Мастер-страницы
http://www.slideshare.net/IgorShkulipa 35
Мастер-страницы
Вызов метода @RenderBody() является плейсхолдером, на место
которого другие представления, которые используют эту мастер-
страницу, будут подставлять свое содержимое.
Чтобы применить мастер-страницу к представлению, мы должны в секции
Layout указать путь к мастер-странице. Например, представление
Index.cshtml, использующее эту мастер-страницу, начинается так:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Если мастер-страница не используестся, то Layout = null;.
Мастер-страница может иметь несколько секций, куда представления
могут поместить свое содержимое. Эти секции обрабатываются
методом RenderSection.
<footer>@RenderSection("Footer")</footer>
http://www.slideshare.net/IgorShkulipa 36
ViewStart
Если у нас в проекте несколько представлений, мы легко можем изменить
для каждого описание мастер-страницы в секции Layout, если,
например, мы решим использовать другую мастер-страницу. Однако,
если у нас много представлений, то это делать будет не очень удобно.
Для более гибкой настройки представлений предназначена страница
_ViewStart.cshtml. Код этой страницы выполняется до кода любого из
представлений, расположенных в том же каталоге. Данный файл
последовательно применяется к каждому представлению,
находящемуся в одном каталоге.
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Этот код выполняется до любого другого кода, определенного в
представлении, поэтому из других представлений мы можем удалить
секцию Layout. Если же представление должно использовать другую
мастер-страницу, то мы просто переопределяем свойство Layout,
дописывая его определение в начало представления.
http://www.slideshare.net/IgorShkulipa 37
Частичные представления
Кроме обычных представлений метод действия может также возвращать
частичные представления. Их отличительной особенностью
является то, что их можно встраивать в другие обычные
представления. Частичные представления могут использоваться также
как и обычные, однако наиболее удобной областью их использования
является рендеринг результатов AJAX-запроса.
За рендеринг частичных представлений отвечает объект
PartialViewResult, который возвращается методом PartialView.
public ActionResult Partial()
{
return PartialView();
}
Чтобы встроить его в какое-нибудь другое представление. Для этого нам
надо применить в любом месте обычного представления хелпер
Html.Partial:
@Html.Partial("Partial")
http://www.slideshare.net/IgorShkulipa 38
Движок представлений и Razor
При вызове метода View контроллер не производит рендеринг представления и не
генерирует разметку html. Контроллер только готовит данные и выбирает, какое
представление надо возвратить в качестве объекта ViewResult. Затем уже
объект ViewResult обращается к движку представления для рендеринга
представления в выходной результат.
До MVC 3 использовался только движок Web Forms, который использовал
стандартный синтаксис ASP.NET.
<% foreach(var b in ViewBag.Books) { %>
<li>Книга: <%: b.Name %></li>
<% } %>
Введение в MVC 3 движка Razor позволило уменьшить синтаксис при вызове кода
C#, сделать код более "чистым". Аналогичный пример на Razor выгдядит так:
@foreach(var b in ViewBag.Books) {
<li>Книга: b.Name </li>
}
Важно понимать, что движок представлений, например, Razor - это не какой-то
новый язык, это лишь способ рендеринга представлений, который имеет
определенный синтаксис для перехода от разметки html к коду C#.
Кроме движка Razor можно использовать и движки сторонних производителей.
http://www.slideshare.net/IgorShkulipa 39
Основы синтаксиса Razor
Использование синтаксиса Razor характеризуется тем, что перед выражением кода
стоит знак @, после которого осуществляется переход к коду C#. Существуют
два типа переходов: к выражениям кода и к блоку кода.
Переход к выражению кода:
<p>@b.Name</p>
<h3>@DateTime.Now.ToShortTimeString()</h3>
Применение блоков кода аналогично, только знак @ ставится перед всем блоком
кода, а движок автоматически определяет, где этот блок кода заканчивается:
@foreach (var b in Model)
{
<p>@b.Name</p>
}
Более того мы можем создавать блоки кода в представлении, создавать там
переменные так же, как и в файле кода C#:
@{
string head = "Привет мир!!!";
head = head + " Добро пожаловать на сайт!";
}
<h3>@head</h3>
http://www.slideshare.net/IgorShkulipa 40
HTML-хелперы
Представления используют разметку html для визуализации содержимого.
Однако фреймворк ASP.NET MVC обладает также таким мощным
инструментом как HTML-хелперы, позволяющие генерировать html-
код.
http://www.slideshare.net/IgorShkulipa 41
Хелпер Html.BeginForm
@using(Html.BeginForm("Buy", "Home", FormMethod.Post))
{
<input type="hidden" value="@ViewBag.BookId" name="BookId" />
<table>
<tr><td><p>Введите свое имя </p></td>
<td><input type="text" name="Person" /> </td></tr>
<tr><td><p>Введите адрес :</p></td>
<td><input type="text" name="Address" /> </td></tr>
<tr><td><input type="submit" value="Отправить" /> </td>
<td></td></tr>
</table>
}
Метод BeginForm принимает в качестве параметров имя метода действия
и имя контроллера, а также тип запроса. Данный хелпер создает как
открывающий тег <form>, так и закрывающий тег </form>. Поэтому
при рендеринге представления в выходной поток у нас получится тот
же самый html-код, что и с применением тега form.
http://www.slideshare.net/IgorShkulipa 42
Другие хелперы
• Хелпер Html.TextBox генерирует тег input со значением атрибута type равным
text.
• Хелпер Html.TextArea используется для создания элемента <textarea>,
который представляет многострочное текстовое поле.
• Вместо скрытого поля input type="hidden", можно использовать хелпер
Html.Hidden.
• Html.Password создает поле для ввода пароля. Он похож на хелпер TextBox, но
вместо введенных символов отображает маску пароля.
• Для создания переключателей применяется хелпер Html.RadioButton. Он
генерирует элемент input со значением type="radio".
• Html.CheckBox может применяться для создания чекбоксов
• Хелпер Html.Label создает элемент <label/>, а передаваемый в хелпер
параметр определяет значение атрибута for и одновременно текст на элементе.
• Хелперы Html.DropDownList и Html.ListBox срздают DropDownList и ListBox.
http://www.slideshare.net/IgorShkulipa 43
Шаблонные хелперы
Кроме стандартных html-хелперов, фреймворк MVC также имеет шаблонные
(шаблонизированные) хелперы
Они более гибки по сравнению с html-хелперами, так как в этом случае нам не надо
думать, какой нам надо создать элемент разметки и какой для этого выбрать
хелпер. Мы просто сообщаем шаблонному хелперу, какое свойство модели мы
хотим использовать, а фреймворк уже сам выбирает, какой html-элемент
сгенерировать, исходя из типа свойства и его метаданных.
Шаблонные хелперы:
• Display. Создает элемент разметки, который доступен только для чтения,
для указанного свойства модели: Html.Display("Name")
• DisplayFor. Строго типизированный аналог хелпера Display:
Html.DisplayFor(e => e.Name)
• Editor. Создает элемент разметки, который доступен для редактирования,
для указанного свойства модели: Html.Editor("Name")
• EditorFor. Строго типизированный аналог хелпера Editor: Html.EditorFor(e
=> e.Name)
http://www.slideshare.net/IgorShkulipa 44
Модели
http://www.slideshare.net/IgorShkulipa 45
Модели
Данные моделей хранятся в базе данных. Чтобы взаимодействовать с
базой данных, очень удобно пользоваться Entity Framework.
http://www.slideshare.net/IgorShkulipa 46
Пример. Модель
public class Position {
public int ID { get; set; }
public string Name { get; set; }
}
public class Persone {
public int ID { get; set; }
public string Surname { get; set; }
public string Name { get; set; }
public string Middle { get; set; }
public string Login { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public int PosID { get; set; }
}
public class TeamContext : DbContext
{
public DbSet<Persone> Persones { get; set; }
public DbSet<Position> Positions { get; set; }
}
http://www.slideshare.net/IgorShkulipa 47
Пример. Репозиторий
public interface IRepository<T> {
void Insert(T entity);
void Delete(T entity);
void Update(T entity, T newValue);
IQueryable<T> SelectAll();
void SubmitAll();
}
public class Repository<T> : IRepository<T> where T : class {
protected DbContext DBContext;
public Repository(DbContext dataContext) {
DBContext = dataContext; }
public void Insert(T entity) {
DBContext.Set<T>().Add(entity); }
public void Delete(T entity) {
DBContext.Set<T>().Remove(entity); }
public void Update(T entity, T newValue) {
var entry = DBContext.Entry<T>(entity);
entry.CurrentValues.SetValues(newValue);
entry.State = EntityState.Modified; }
public IQueryable<T> SelectAll() {
return DBContext.Set<T>(); }
public void SubmitAll() {
DBContext.SaveChanges(); }
}
http://www.slideshare.net/IgorShkulipa 48
Пример. Модель
<connectionStrings>
<add name="TeamContext"
providerName="System.Data.SqlClient"
connectionString="Data Source=(LocalDb)v11.0;
AttachDBFilename=|DataDirectory|Team.mdf" />
</connectionStrings>
http://www.slideshare.net/IgorShkulipa 49
Пример. Контроллер
public class HomeController : Controller {
static TeamContext model =new TeamContext();
static IRepository<Persone> persons = new Repository<Persone>(model);
static IRepository<Position> positions = new Repository<Position>(model);
[HttpPost]
public ActionResult NewPersone() {
Persone newPer = new Persone();
newPer.Name = Request.Params["name"];
newPer.Middle = Request.Params["middle"];
newPer.Surname = Request.Params["surname"];
newPer.Login = Request.Params["login"];
newPer.Password = Request.Params["password"];
newPer.Email = Request.Params["email"];
newPer.PosID = Convert.ToInt32(Request.Params["Positions"]);
newPer.ID = persons.SelectAll().Count<Persone>()+1;
persons.Insert(newPer);
persons.SubmitAll();
var list = new List<string>();
foreach (var pr in persons.SelectAll())
{
string li = pr.ID.ToString()+" "+pr.Name+" "+pr.Middle+" "+pr.Surname;
list.Add(li);
}
ViewData["Positions"] = list;
return PartialView(list);
}
http://www.slideshare.net/IgorShkulipa 50
Пример. Контроллер
public ActionResult Index()
{
ViewBag.Message = "Hello, World of MVC!";
ViewBag.Persons = new List<Persone>();
var list1 = new List<SelectListItem>();
foreach (var pr in positions.SelectAll())
{
SelectListItem sli = new SelectListItem();
sli.Text = pr.Name;
sli.Value = pr.ID.ToString();
sli.Selected = false;
list1.Add(sli);
}
ViewData["Positions"] = list1;
return View();
}
http://www.slideshare.net/IgorShkulipa 51
Пример. Контроллер
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
http://www.slideshare.net/IgorShkulipa 52
Пример. Представление
http://www.slideshare.net/IgorShkulipa 53
Пример. Представление. Index.cshtml
@{
ViewBag.Title = "ASP.NET MVC Example 1";
}
@section featured {
<section class="featured">
<div class="content-wrapper">
<hgroup class="title">
<h1>@ViewBag.Title.</h1>
<h2>@ViewBag.Message</h2>
</hgroup>
<p>
</p>
</div>
</section>
}
http://www.slideshare.net/IgorShkulipa 54
Пример. Представление. Index.cshtml
<table style="width:100%; border:solid 1px;">
<tr style="vertical-align:top;">
<td style="width: 50%; border: solid 1px;">
<form action="/Home/NewPersone" method="post">
<label >Name</label>
@Html.TextBox("name")
<label>Middle</label>
@Html.TextBox("middle")
<label>Surname</label>
@Html.TextBox("surname")
<label>Login</label>
@Html.TextBox("login")
<label>Password</label>
@Html.Password("password")
<label>e-mail</label>
@Html.TextBox("email")
@Html.DropDownList("Positions")
<input type="submit" value="Add" />
</form>
</td>
http://www.slideshare.net/IgorShkulipa 55
Пример. Представление. Index.cshtml
<td style="width: 50%; border: solid 1px; ">
<table style="border:solid 1px; width:100%;">
@foreach (var item in ViewData["Persons"] as
IEnumerable<MvcApplication1.Models.Persone>)
{
<tr style="border:solid 1px; width:100%;">
<td style="width: 5%; border: solid 1px;">
@Html.Encode(item.ID.ToString()) </td>
<td style="width: 10%; border: solid 1px;">
@Html.Encode(item.Name) </td>
<td style="width: 10%; border: solid 1px;">
@Html.Encode(item.Middle) </td>
<td style="width: 10%; border: solid 1px;">
@Html.Encode(item.Surname) </td>
<td style="width: 65%; border: solid 1px;">
@Html.Encode(item.Email.ToString()) </td>
</tr>
}
</table>
</td>
</tr>
</table>
http://www.slideshare.net/IgorShkulipa 56
Пример. Результат
http://www.slideshare.net/IgorShkulipa 57
Пример. Результат
http://www.slideshare.net/IgorShkulipa 58
Пример. Результат
http://www.slideshare.net/IgorShkulipa 59
Пример. Результат
http://www.slideshare.net/IgorShkulipa 60
Лабораторная работа №9
Выполнить задание Лабораторной работы №1 с использованием Microsoft
ASP.NET MVC.
1 sur 60

Recommandé

C# Web. Занятие 08. par
C# Web. Занятие 08.C# Web. Занятие 08.
C# Web. Занятие 08.Igor Shkulipa
229 vues10 diapositives
C# Web. Занятие 07. par
C# Web. Занятие 07.C# Web. Занятие 07.
C# Web. Занятие 07.Igor Shkulipa
706 vues53 diapositives
C# Web. Занятие 04. par
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
798 vues38 diapositives
C# Web. Занятие 16. par
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.Igor Shkulipa
376 vues44 diapositives
C# Web. Занятие 01. par
C# Web. Занятие 01.C# Web. Занятие 01.
C# Web. Занятие 01.Igor Shkulipa
1.1K vues75 diapositives
Общие темы. Тема 01. par
Общие темы. Тема 01.Общие темы. Тема 01.
Общие темы. Тема 01.Igor Shkulipa
539 vues47 diapositives

Contenu connexe

Tendances

C# Web. Занятие 05. par
C# Web. Занятие 05.C# Web. Занятие 05.
C# Web. Занятие 05.Igor Shkulipa
490 vues50 diapositives
Как и зачем мы тестируем UI par
Как и зачем мы тестируем UIКак и зачем мы тестируем UI
Как и зачем мы тестируем UIVyacheslav Lyalkin
14.1K vues22 diapositives
Eleanor par
EleanorEleanor
EleanorSC3402
235 vues12 diapositives
1С-Битрикс: Управление сайтом Версия .NET par
1С-Битрикс: Управление сайтом Версия .NET1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NETMedia Gorod
450 vues25 diapositives
C# Web. Занятие 11. par
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.Igor Shkulipa
195 vues28 diapositives
Views обзор par
Views обзорViews обзор
Views обзорАнтон Звонов
3.2K vues22 diapositives

Tendances(20)

Как и зачем мы тестируем UI par Vyacheslav Lyalkin
Как и зачем мы тестируем UIКак и зачем мы тестируем UI
Как и зачем мы тестируем UI
Vyacheslav Lyalkin14.1K vues
Eleanor par SC3402
EleanorEleanor
Eleanor
SC3402235 vues
1С-Битрикс: Управление сайтом Версия .NET par Media Gorod
1С-Битрикс: Управление сайтом Версия .NET1С-Битрикс: Управление сайтом Версия .NET
1С-Битрикс: Управление сайтом Версия .NET
Media Gorod450 vues
Средства разработки web приложений (Web frameworks) par Fedor Malyshkin
Средства разработки web приложений
(Web frameworks)Средства разработки web приложений
(Web frameworks)
Средства разработки web приложений (Web frameworks)
Fedor Malyshkin1K vues
Как пройти собеседование и получить первую работу на Swift par Anton Loginov
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
Anton Loginov2.1K vues
AngularJS basics & theory par DevOWL Meetup
AngularJS basics & theoryAngularJS basics & theory
AngularJS basics & theory
DevOWL Meetup40.2K vues
1.1 training tfs scrum par vardziya
1.1 training tfs scrum1.1 training tfs scrum
1.1 training tfs scrum
vardziya218 vues
Eleanor CMS par SC3402
Eleanor CMSEleanor CMS
Eleanor CMS
SC3402337 vues
JavaScript Базовый. Занятие 10. par Igor Shkulipa
JavaScript Базовый. Занятие 10.JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 10.
Igor Shkulipa287 vues
создание живых сайтов par metaform
создание живых сайтовсоздание живых сайтов
создание живых сайтов
metaform1.1K vues
Share Point Workflow par MaximKo
Share Point WorkflowShare Point Workflow
Share Point Workflow
MaximKo310 vues
Платформа Docsvision par Docsvision
Платформа DocsvisionПлатформа Docsvision
Платформа Docsvision
Docsvision13.4K vues
Паттерны проектирования par ITCP Community
Паттерны проектированияПаттерны проектирования
Паттерны проектирования
ITCP Community127 vues

En vedette

Production diary 7 par
Production diary 7Production diary 7
Production diary 7Laila Jaleel
149 vues4 diapositives
Steffy par
SteffySteffy
SteffySteffy Wilson
196 vues13 diapositives
C# Desktop. Занятие 09. par
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.Igor Shkulipa
181 vues28 diapositives
Biotecnología par
BiotecnologíaBiotecnología
Biotecnologíakarolinadiaz2015
154 vues3 diapositives
Energías limpias par
Energías limpiasEnergías limpias
Energías limpiasAnwar Pérez
203 vues7 diapositives
C++ Базовый. Занятие 04. par
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
302 vues17 diapositives

En vedette(20)

C# Desktop. Занятие 09. par Igor Shkulipa
C# Desktop. Занятие 09.C# Desktop. Занятие 09.
C# Desktop. Занятие 09.
Igor Shkulipa181 vues
C++ Базовый. Занятие 04. par Igor Shkulipa
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
Igor Shkulipa302 vues
JavaScript Базовый. Занятие 01. par Igor Shkulipa
JavaScript Базовый. Занятие 01.JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 01.
Igor Shkulipa562 vues
Trabajo completo par Ida Morán
Trabajo completo Trabajo completo
Trabajo completo
Ida Morán2.6K vues
C++ STL & Qt. Занятие 10. par Igor Shkulipa
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
Igor Shkulipa351 vues
C++ STL & Qt. Занятие 01. par Igor Shkulipa
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
Igor Shkulipa562 vues
C# Desktop. Занятие 12. par Igor Shkulipa
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
Igor Shkulipa363 vues
C++ STL & Qt. Занятие 08. par Igor Shkulipa
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
Igor Shkulipa326 vues

Similaire à C# Web. Занятие 09.

Шаблоны проектирования в Magento par
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в MagentoPavel Usachev
2.3K vues25 diapositives
ASP.NET, MVC, ASP.NET MVC par
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCGetDev.NET
2.6K vues29 diapositives
Backbone lesson 1 par
Backbone lesson 1Backbone lesson 1
Backbone lesson 1Mihail Skida
1.4K vues13 diapositives
Web application framework par
Web application frameworkWeb application framework
Web application frameworkViktor Chukhantsev
311 vues7 diapositives
ASP.NET MVC 3 Anton Vidishchev par
ASP.NET MVC 3 Anton VidishchevASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton VidishchevAlex Tumanoff
396 vues27 diapositives
The Old New ASP.NET par
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NETVitaly Baum
1K vues88 diapositives

Similaire à C# Web. Занятие 09.(20)

Шаблоны проектирования в Magento par Pavel Usachev
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в Magento
Pavel Usachev2.3K vues
ASP.NET, MVC, ASP.NET MVC par GetDev.NET
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVC
GetDev.NET2.6K vues
ASP.NET MVC 3 Anton Vidishchev par Alex Tumanoff
ASP.NET MVC 3 Anton VidishchevASP.NET MVC 3 Anton Vidishchev
ASP.NET MVC 3 Anton Vidishchev
Alex Tumanoff396 vues
Разработка Enterprise-приложения на основе Spring Framework par CUSTIS
Разработка Enterprise-приложения на основе Spring FrameworkРазработка Enterprise-приложения на основе Spring Framework
Разработка Enterprise-приложения на основе Spring Framework
CUSTIS1.1K vues
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про... par Dev_Party
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Dev_Party790 vues
Mvc, mvp and mvvm: A comparison of architectural patterns par Ivan Dyachenko
Mvc, mvp and mvvm: A comparison of architectural patternsMvc, mvp and mvvm: A comparison of architectural patterns
Mvc, mvp and mvvm: A comparison of architectural patterns
Ivan Dyachenko2.6K vues
Joomla (Админка) www.hotwebstudio.ru par hotwebstudio.ru
Joomla (Админка) www.hotwebstudio.ruJoomla (Админка) www.hotwebstudio.ru
Joomla (Админка) www.hotwebstudio.ru
hotwebstudio.ru 520 vues
Программируемость фабрики ACI. Объектная модель, REST API, ACI Python SDK par Cisco Russia
Программируемость фабрики ACI. Объектная модель, REST API, ACI Python SDKПрограммируемость фабрики ACI. Объектная модель, REST API, ACI Python SDK
Программируемость фабрики ACI. Объектная модель, REST API, ACI Python SDK
Cisco Russia 374 vues
Bloch, bodoff руководство. сервлеты par alexey1991
Bloch, bodoff   руководство. сервлетыBloch, bodoff   руководство. сервлеты
Bloch, bodoff руководство. сервлеты
alexey19912K vues
C# Desktop. Занятие 08. par Igor Shkulipa
C# Desktop. Занятие 08.C# Desktop. Занятие 08.
C# Desktop. Занятие 08.
Igor Shkulipa387 vues
Модульная структура par Denis Tsvettsih
Модульная структураМодульная структура
Модульная структура
Denis Tsvettsih313 vues
Модульная структура. Цветцих Денис D2D Just.NET par Dev2Dev
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
Dev2Dev526 vues

Plus de Igor Shkulipa

Общие темы. Тема 03. par
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03. Igor Shkulipa
1.9K vues42 diapositives
Общие темы. Тема 02. par
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
399 vues107 diapositives
JavaScript Базовый. Занятие 06. par
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.Igor Shkulipa
267 vues37 diapositives
JavaScript Базовый. Занятие 11. par
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.Igor Shkulipa
679 vues51 diapositives
JavaScript Базовый. Занятие 05. par
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.Igor Shkulipa
390 vues47 diapositives
JavaScript Базовый. Занятие 08. par
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.Igor Shkulipa
201 vues23 diapositives

Plus de Igor Shkulipa(16)

Общие темы. Тема 03. par Igor Shkulipa
Общие темы. Тема 03. Общие темы. Тема 03.
Общие темы. Тема 03.
Igor Shkulipa1.9K vues
Общие темы. Тема 02. par Igor Shkulipa
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
Igor Shkulipa399 vues
JavaScript Базовый. Занятие 06. par Igor Shkulipa
JavaScript Базовый. Занятие 06.JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 06.
Igor Shkulipa267 vues
JavaScript Базовый. Занятие 11. par Igor Shkulipa
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
Igor Shkulipa679 vues
JavaScript Базовый. Занятие 05. par Igor Shkulipa
JavaScript Базовый. Занятие 05.JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 05.
Igor Shkulipa390 vues
JavaScript Базовый. Занятие 08. par Igor Shkulipa
JavaScript Базовый. Занятие 08.JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 08.
Igor Shkulipa201 vues
JavaScript Базовый. Занятие 07. par Igor Shkulipa
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
Igor Shkulipa193 vues
JavaScript Базовый. Занятие 04. par Igor Shkulipa
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
Igor Shkulipa231 vues
JavaScript Базовый. Занятие 03. par Igor Shkulipa
JavaScript Базовый. Занятие 03.JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 03.
Igor Shkulipa212 vues
JavaScript Базовый. Занятие 02. par Igor Shkulipa
JavaScript Базовый. Занятие 02.JavaScript Базовый. Занятие 02.
JavaScript Базовый. Занятие 02.
Igor Shkulipa580 vues
C# Desktop. Занятие 13. par Igor Shkulipa
C# Desktop. Занятие 13.C# Desktop. Занятие 13.
C# Desktop. Занятие 13.
Igor Shkulipa194 vues

C# Web. Занятие 09.

  • 1. Темы лекции: ASP.NET. MVC. Часть 1. Практическое задание: ASP.NET MVC. Тренер: Игорь Шкулипа, к.т.н. Разработка Веб-приложений на платформе Microsoft .NET Framework. Занятие 9
  • 2. http://www.slideshare.net/IgorShkulipa 2 Шаблон MVC Шаблон проектирования MVC разделяет работу веб-приложения на три отдельные функциональные роли: • модель данных (model) • пользовательский интерфейс (view) • управляющую логику (controller) Таким образом, изменения, вносимые в один из компонентов, оказывают минимально возможное воздействие на другие компоненты.
  • 3. http://www.slideshare.net/IgorShkulipa 3 ASP.NET MVC ASP.NET MVC представляет собой платформу для создания сайтов и веб- приложений с использованием паттерна (или шаблона) MVC (model - view - controller). • Контроллер (controller) представляет класс, с которого начинается работа приложения. Этот класс обеспечивает связь между моделью и представлением. Получая вводимые пользователем данные, контроллер исходя из внутренней логики при необходимости обращается к модели и генерирует соответствующее представление. • Представление (view) - это визуальная часть или пользовательский интерфейс приложения - например, html-страница, через которую пользователь, зашедший на сайт, взаимодействует с веб- приложением. • Модель (model) представляет набор классов, описывающих логику используемых данных.
  • 5. http://www.slideshare.net/IgorShkulipa 5 ASP.NET MVC и ASP.NET Web Forms ASP.NET MVC является в некотором роде конкурентом для традиционных веб-форм и имеет по сравнению с ними следующие преимущества: • Разделение ответственности. В MVC приложение состоит из трех частей: контроллера, представления и модели, каждая из которых выполняет свои специфичные функции. В итоге приложение будет легче поддерживать модифицировать в будущем. • В силу разделения ответственности приложения MVC обладают лучшей тестируемостью. И мы можем тестировать отдельные компоненты независимо друг от друга. • Соответствие протоколу HTTP. Приложения MVC в отличие от веб-форм не поддерживают объекты состояния (ViewState). Ясность и простота платформы позволяют добиться большего контроля над работой приложения • Гибкость. Вы можете настраивать различные компоненты платформы по своему усмотрению. Изменять какие-либо части конвейера работы MVC или адаптировать его к своим нуждам и потребностям. В то же время не стоит однозначно сбрасывать со счетов ASP.NET WebForms. Поскольку она также имеет свои сильные стороны, например, модель событий, которая будет ближе тем разработчикам, которые ранее занимались созданием клиентских приложений.
  • 6. http://www.slideshare.net/IgorShkulipa 6 Шаблоны приложений MVC в Visual Studio • Internet Application. Данный шаблон представляет некоторую базовую функциональность, например, управление учетными записями, которую будет содержать новое приложение. • Intranet Application. Данный шаблон похож на шаблон Internet Application. Отличие состоит в том, что в Intranet Application для управления учетными записями используется аутентификация Windows, а не система ASP.NET Membership. • Empty. Этот шаблон представляет абсолютно чистое приложение без каких-либо файлов и структуры папок. • Basic. Этот шаблон также представляет пустой проект. Правда, он содержит базовые каталоги, CSS, инфраструктуру приложения MVC. Ранее в MVC 3 этот шаблон назывался Empty. • Mobile Application. Это новинка MVC 4, предназначенная для создания веб- приложений для мобильных платформ. • Web API. Предназначен для создания сервисов и для работы с фреймворком Web API.
  • 7. http://www.slideshare.net/IgorShkulipa 7 Шаблоны приложений MVC в Visual Studio В дополнение к предыдущим проектам в обновлениях Visual Studio 2012 и в Visual Studio 2013 были добавлены еще два типа проектов: • Single Page Application. Шаблон, предназначенный для создания сайтов-одностраничников. • Facebook Application. Предназначен для создания веб-приложений под социальную сеть Facebook.
  • 8. http://www.slideshare.net/IgorShkulipa 8 Структура проекта MVC • App_Data. В этой папке хранятся все необходимые файлы и ресурсы, например, базы данных, используемые приложением. После развертывания приложения только непосредственно приложение может работать с этой папкой, доступ же простых пользователей в эту папку запрещен. • Файл Global.asax и папка App_Start. В mvc 4 была добавлена папка App_Start. Она включает весь функционал конфигурации приложения, который в предыдущих версиях содержался в файле Global.asax, а теперь перенесен в набор статичных классов, вызываемых в Global.asax. Эти статичные классы содержат некоторую логику инициализации приложения, выполняющуюся при запуске. • Файл Web.config. Файл конфигурации приложения, который находится в корневой папке приложения • Content. Содержит некоторые вспомогательные файлы, которые не включают код на c# или javascript, и которые развертываются вместе с приложением. В частности, здесь могут размещаться файлы стилей css. Так, в этой папке вы увидите файл Site.css, который содержит стили приложения, а также папку с темами, включающую стили css и изображения для определенных тем. • Controllers. Содержит контроллеры - классы, отвечающие за работу приложения. По умолчанию здесь находятся два контроллера - HomeController и AccountController.
  • 9. http://www.slideshare.net/IgorShkulipa 9 Структура проекта MVC • Папки Images и Scripts. Папки Images и Scripts содержат соответственно изображения и скрипты на JavaScript, используемые в приложении. По умолчанию эти папки уже содержат файлы, в частности, в папку Scripts уже помещены файлы библиотеки jQuery. • Models. Содержит модели, используемые приложением. По умолчанию здесь определена одна модель - AccountModel, которая представляет отдельную учетную запись. • Views. Здесь размещаются представления. Представления группированы по папкам, каждая из которых соответствует одному контроллеру. После получения и обработки запроса контроллер, отправляет одно из этих представлений, заполненных некоторыми данными, клиенту. Кроме того, имеется папка общих для контроллеров представлений - папка Shared
  • 11. http://www.slideshare.net/IgorShkulipa 11 Контроллеры Контроллер является центральным компонентом в архитектуре MVC. Контроллер получает ввод пользователя, обрабатывает его и посылает обратно результат обработки, например, в виде представления. При использовании контроллеров существуют некоторые условности. Так, по соглашениям об именовании названия контроллеров должны оканчиваться на суффикс "Controller", остальная же часть до этого префикса считается именем контроллера. Чтобы обратиться контроллеру из веб-браузера, нам надо в адресной строке набрать адрес_сайта/Имя_контроллера/. Так, по запросу адрес_сайта/Home/ система маршрутизации по умолчанию вызовет метод Index контроллера HomeController для обработки входящего запроса. Если мы хотим отправить запрос к конкретному методу контроллера, то нужно указывать этот метод явно: адрес_сайта/Имя_контроллера/Метод_контроллера, например, адрес_сайта/Home/Buy - обращение к методу Buy контроллера HomeController. Контроллер представляет обычный класс, который наследуется от базового класса System.Web.Mvc.Controller. В свою очередь класс Controller реализует абстрактный базовый класс ControllerBase, а через него и интерфейс IController. Таким образом, формально, чтобы создать свой класс контроллера, достаточно создать класс, реализующий интерфейс IController и имеющий в имени суффикс Controller.
  • 12. http://www.slideshare.net/IgorShkulipa 12 Интерфейс IController Интерфейс IController определяет один единственный метод Execute, который отвечает за обработку контекста запроса: public interface IController { void Execute(RequestContext requestContext); } Например: public class MyController : IController { public void Execute(RequestContext requestContext) { string ip = requestContext.HttpContext.Request.UserHostAddress; var response = requestContext.HttpContext.Response; response.Write("<h2>Ваш IP-адрес: " + ip + "</h2>"); } } Таким образом, перейдя по пути адрес_сайта/My/, пользователь увидит свой ip-адрес.
  • 13. http://www.slideshare.net/IgorShkulipa 13 Класс Controller Чтобы создать стандартный контроллер, можно также добавить в папку Controllers простой класс и унаследовать от класса Controller, например: public class MyController : Controller { public ActionResult Index() { return View(); } }
  • 14. http://www.slideshare.net/IgorShkulipa 14 Методы действий Методы действий (action methods) представляют такие методы контроллера, которые обрабатывают запросы по определенному URL. Так как запросы бывают разных типов, например, GET и POST, фреймворк ASP.NET MVC позволяет определить тип обрабатываемого запроса для действия, применив к нему соответствующий атрибут: [HttpGet], [HttpPost], [HttpDelete] или [HttpPut]. Однако не все методы контроллера являются методами действий. Методы действий всегда имеют модификатор public. Закрытых приватных методов действий не бывает. Но контроллер может также включать и обычные методы, которые могут использоваться в вспомогательных целях. [HttpGet] public ActionResult Method(int id) { return View(); } [HttpPost] public string Method() { return “Bingo!"; }
  • 15. http://www.slideshare.net/IgorShkulipa 15 Получение входных данных Стандартный get-запрос может принимать примерно следующую форму: название_ресурса?параметр1=значение1&параметр2=значение2 То есть запрос к методу мог бы выглядеть так: Home/Method?id=2. Название параметров метода должно совпадать с названием параметров в строке запроса. Благодаря этому система сможет их автоматически связать. Кроме того, система маршрутизации позволяет создавать маршруты. Например, по умолчанию в проекте MVC определяется следующий маршрут: Контроллер/Метод/id. Последний параметр является опциональным. И благодаря этому мы можем передать параметр id и так: Home/Method/2
  • 16. http://www.slideshare.net/IgorShkulipa 16 Получение данных из контекста запроса Кроме того, мы можем получить параметры и другие данные, связанные с запросом, из объектов контекста запроса. Доступны следующие объекты контекста: Request, Response, RoutedData, HttpContext и Server. Объект Request содержит коллекцию Params, которая хранит все параметры, переданные в запросы.
  • 17. http://www.slideshare.net/IgorShkulipa 17 Результаты действий Когда пользователь обращается к ресурсу, как правило, он ожидает получить определенный ответ, например, в виде веб-страницы с некоторыми данными. На стороне сервера метод контроллера, получая параметры, обрабатывает их и формирует некоторый ответ в виде результата действия. public abstract class ActionResult { public abstract void ExecuteResult(ControllerContext context); }
  • 18. http://www.slideshare.net/IgorShkulipa 18 Встроенные классы, производные от ActionResult Фрейморк ASP.NET MVC предлагает палитру классов результатов действий, которые охватывают большинство ситуаций. • ContentResult: пишет указанный контент напрямую в ответ в виде строки • EmptyResult: по сути ничего не делает, отправляет пустой ответ • FileResult: является базовым классом для всех объектов, пишущих бинарный ответ в выходной поток. Предназначен для отправки файлов • FileContentResult: класс, производный от FileResult, пишет в ответ массив байтов • FilePathResult: также производный от FileResult класс, пишет в ответ файл, находящийся по заданному пути • FileStreamResult: класс, производный от FileResult, пишет бинарный поток в выходной ответ • HttpStatusCodeResult: результат действия, который возвращает клиенту определенный статусный код HTTP • HttpNotFoundResult: производный от HttpStatusCodeResult. Возвращает клиенту ответ в виде статусного кода HTTP 404, указывая, что запрошенный ресурс не найден
  • 19. http://www.slideshare.net/IgorShkulipa 19 Встроенные классы, производные от ActionResult • HttpUnauthorizedResult: класс, производный от HttpStatusCodeResult. Возвращает клиенту ответ в виде статусного кода HTTP 401, указывая, что пользователь не прошел авторизацию и не имеет прав доступа к запрошенному ресурсу. • JavaScriptResult: возвращает в ответ в качестве содержимого код JavaScript • JsonResult: возвращает в качестве ответа объект или набор объектов в формате JSON • PartialViewResult: производит рендеринг частичного представления в выходной поток • RedirectResult: перенаправляет пользователя по другому адресу URL, возвращая статусный код 302 для временной переадресации или код 301 для постоянной переадресации зависимости от того, установлен ли флаг Permanent. • RedirectToRouteResult: класс работает подобно RedirectResult, но перенаправляет пользователя по определенному адресу URL, указанному через параметры маршрута • ViewResult: производит рендеринг представления и отправляет результаты рендеринга в виде html-страницы клиенту
  • 20. http://www.slideshare.net/IgorShkulipa 20 ViewResult Класс ViewResult является наиболее часто возвращаемым результатом действий контроллера. Он производит рендеринг представления в веб- страницу и возвращает ее в виде ответа клиенту. Чтобы возвратить объект ViewResult используется метод View: public class HomeController : Controller { public ActionResult Index() { return View(); } } Вызов метода View возвращает объект ViewResult. Затем уже ViewResult производит рендеринг определенного представления в ответ. По умолчанию контроллер производит поиск представления в проекте по следующему пути: /Views/Имя_контроллера/Имя_представления.cshtml
  • 21. http://www.slideshare.net/IgorShkulipa 21 ViewResult Можно также задать имя представления явным образом: public class HomeController : Controller { public ViewResult SomeMethod() { return View("Index"); } }
  • 22. http://www.slideshare.net/IgorShkulipa 22 Переадресация Существует два вида переадресации: временная и постоянная. И в зависимости от вида переадресации при ее выполнении сервер посылает браузерам один из двух кодов HTTP: • статусный код 301 представляет постоянную переадресацию. При данном типе переадресации предполагается, что запрашиваемый документ окончательно перемещен в другое место. После получения данного статусного кода браузер может автоматически настраивать запросы на новый ресурс, даже если старый ресурс со временем перестанет применять переадресацию. Поэтому данный способ использовать нежелательно. • статусный код 302 представляет временную переадресацию. При временной переадресации считается, что запрашиваемый документ временно перемещен на другую страницу. В обоих случаях для переадресации будет использоваться объект RedirectResult, однако метод, возвращающий данный объект, будет отличаться. Для временной переадресации применяется метод Redirect: return Redirect("/Home/Index"); Для постоянной переадресации подобным образом используется метод RedirectPermanent: return RedirectPermanent("/Home/Index");
  • 23. http://www.slideshare.net/IgorShkulipa 23 RedirectToRoute и RedirectToAction Еще один класс для создания переадресации - RedirectToRouteResult - позволяет выполнить более детальную настройку перенаправлений. Он возвращается двумя методами: RedirectToAction и RedirectToRoute. Метод RedirectToRoute позволяет произвести перенаправление по определенному маршруту внутри домена: return RedirectToRoute(new { controller="Home", action="Index"}); Метод RedirectToAction позволяет перейти к определенному действию определенного контроллера. Он также позволяет задать передаваемые параметры: return RedirectToAction("Square", "Home", new { a=10,h=12}); Методы RedirectToRoute и RedirectToAction представляют временную переадресацию. Но они имеют свои двойники для создания постоянной переадресации: RedirectToRoutePermanent и RedirectToActionPermanent. Их действие аналогично, разница лишь в том, что они отправляют браузеру статусный код 301.
  • 24. http://www.slideshare.net/IgorShkulipa 24 Отправка ошибок и статусных кодов Иногда возникает необходимость отправить сообщения об ошибках при доступе к тому или иному ресурсу. Обычно, если ресурс недоступен, MVC-фреймворк автоматически отреагирует на эту ситуацию, отправив соответствующий статусный код. Но в некоторых ситуациях нужно более тонко реагировать на полученный запрос. public ActionResult Check(int age) { if (age < 30) { return new HttpStatusCodeResult(404); } return View(); } В качестве альтернативы также можно возвращать объект HttpNotFoundResult с помощью метода HttpNotFound
  • 25. http://www.slideshare.net/IgorShkulipa 25 HttpContext Информация о запросе содержится в свойстве Request. HttpContext.Request представляет объект класса, унаследованного от HttpRequestBase, и поэтому содержит все его свойства. • Получение браузера пользователя: HttpContext.Request.Browser • Иногда просто браузера недостаточно, тогда можно обратиться к агенту пользователя: HttpContext.Request.UserAgent • Получение url запроса: HttpContext.Request.RawUrl • Получение IP-адреса пользователя: HttpContext.Request.UserHostAddress • Чтобы получить куки, можно воспользоваться свойством HttpContext.Request.Cookies.
  • 26. http://www.slideshare.net/IgorShkulipa 26 Передача данных из контроллера в представление. ViewData Существует несколько способов передачи данных из контроллера в представление. Первый из них представляет использование объекта ViewData. ViewData представляет словарь из пар ключ-значение: public ViewResult SomeMethod() { ViewData["Head"] = "Привет мир!"; return View("SomeView"); } Тогда в представлении SomeView.cshtml мы могли бы получить передаваемую строку следующим образом: ... <body> <div> <h2>@ViewData["Head"]</h2> </div> </body> </html>
  • 27. http://www.slideshare.net/IgorShkulipa 27 Передача данных из контроллера в представление. ViewBag Еще один способ передачи данных представляет объект ViewBag. Этот объект позволяет определить различные свойства и присвоить им любое значение. public ViewResult SomeMethod() { ViewBag.Head = "Привет мир!"; return View("SomeView"); } И таким же образом изменить представление: ... <body> <div> <h2>@ViewBag.Head</h2> </div> </body> </html> И не важно, что изначально объект ViewBag не содержит никакого свойства Head, оно определяется динамически. При этом свойства ViewBag могут содержать не только простые объекты типа string или int, но и сложные данные.
  • 29. http://www.slideshare.net/IgorShkulipa 29 Представления В ASP.NET MVC 4 представления представляют файлы с расширением cshtml/vbhtml/aspx/ascx, которые содержат код с интерфейсом пользователя, как правило, на языке html. Стандартное представление: @{ Layout = null;} <!DOCTYPE html> <html> <head></head> <body> <div> <h2>@ViewBag.Message</h2> </div> </body></html> Несмотря на то, что представление в основном состоит из кода html, оно не является html-страницей. При компиляции приложения на основе требуемого представления сначала генерируется класс на языке C#, а затем этот класс компилируется. Все добавляемые представления, как правило, группируются по контроллерам в соответствующие папки в каталоге Views. Представления, которые относятся к методам контроллера Home, будут находиться в проекте в папке Views/Home. Однако, при необходимости, можно создать в каталоге Views папку с произвольным именем, где будут храниться дополнительные представления, необязательно связанные с определенными методами контроллера.
  • 31. http://www.slideshare.net/IgorShkulipa 31 Параметры представлений • View Engine - выпадающий список для выбора движка представления. С ASP.NET MVC 4 данное диалоговое окно поддерживает несколько движков представлений. По умолчанию здесь представлены две возможности для выбора: Razor и ASPX. Но при установке сторонних движков они также могут быть доступны для выбора. • Create a strongly-typed view - эта опция позволит создать строго типизированное представление. После ее выбора нужно будет указать модель в выпадающем списке, который содержит список всех моделей. Но чтобы все модели приложения можно было использовать, перед добавлением представления нужно скомпилировать проект. • Scaffold template - опция позволяет выбрать шаблон формирования нового представления.
  • 32. http://www.slideshare.net/IgorShkulipa 32 Типы шаблонов представления • Empty. Создается пустое представление. В представлении только определен тип модели с помощью директивы @model • Create. Создается представление с формой для создания новых объектов модели. Генерируется метка и поле редактирования для каждого свойства модели. • Delete. Создается представление с формой для удаления существующих объектов модели. Отображаются метка и текущее значение каждого свойства модели • И др. • Create as a Partial View - выбор этой опции указывает, что созданное представление будет неполным. В итоге представление будет вполне обычным, однако в его шапке не будет таких тегов, как <html> и <head> • Use a layout or Master Page - эта опция указывает, будут ли использоваться мастер-страницы (главные страницы) или представление будет самодостаточным. Для движка Razor указание мастер-страницы не является обязательным, если вы собираетесь использовать мастер-страницу, определенную по умолчанию в файле _ViewStart.cshtml. Однако, если вы хотите переопределить мастер-страницу, то можете воспользоваться этой опцией.
  • 33. http://www.slideshare.net/IgorShkulipa 33 Строго типизированные представления Хотя страницы с объектом ViewBag работают как надо, но есть и другой способ, иногда более предпочтительный, который заключается в использовании строго типизированных представлений. Подобные представления позволяют передавать данные не через объект ViewBag, а напрямую в представление через параметр метода View. Код метода контроллера мог бы выглядеть так: BookContext db = new BookContext(); public ActionResult Index() { return View(db.Books); } Теперь, чтобы связать представление с передаваемым параметром, надо добавить в представление директиву @model с указанием типа передаваемых данных. @model IEnumerable<BookStore.Models.Book> @{ Layout = "~/Views/Shared/_Layout.cshtml"; } <div> @foreach (var b in Model) { <li>@b.Name</li> } </div> Объект Model представляет тип модели, указанной в директиве @model, и будет хранить переданные из контроллера данные.
  • 35. http://www.slideshare.net/IgorShkulipa 35 Мастер-страницы Вызов метода @RenderBody() является плейсхолдером, на место которого другие представления, которые используют эту мастер- страницу, будут подставлять свое содержимое. Чтобы применить мастер-страницу к представлению, мы должны в секции Layout указать путь к мастер-странице. Например, представление Index.cshtml, использующее эту мастер-страницу, начинается так: @{ Layout = "~/Views/Shared/_Layout.cshtml"; } Если мастер-страница не используестся, то Layout = null;. Мастер-страница может иметь несколько секций, куда представления могут поместить свое содержимое. Эти секции обрабатываются методом RenderSection. <footer>@RenderSection("Footer")</footer>
  • 36. http://www.slideshare.net/IgorShkulipa 36 ViewStart Если у нас в проекте несколько представлений, мы легко можем изменить для каждого описание мастер-страницы в секции Layout, если, например, мы решим использовать другую мастер-страницу. Однако, если у нас много представлений, то это делать будет не очень удобно. Для более гибкой настройки представлений предназначена страница _ViewStart.cshtml. Код этой страницы выполняется до кода любого из представлений, расположенных в том же каталоге. Данный файл последовательно применяется к каждому представлению, находящемуся в одном каталоге. @{ Layout = "~/Views/Shared/_Layout.cshtml"; } Этот код выполняется до любого другого кода, определенного в представлении, поэтому из других представлений мы можем удалить секцию Layout. Если же представление должно использовать другую мастер-страницу, то мы просто переопределяем свойство Layout, дописывая его определение в начало представления.
  • 37. http://www.slideshare.net/IgorShkulipa 37 Частичные представления Кроме обычных представлений метод действия может также возвращать частичные представления. Их отличительной особенностью является то, что их можно встраивать в другие обычные представления. Частичные представления могут использоваться также как и обычные, однако наиболее удобной областью их использования является рендеринг результатов AJAX-запроса. За рендеринг частичных представлений отвечает объект PartialViewResult, который возвращается методом PartialView. public ActionResult Partial() { return PartialView(); } Чтобы встроить его в какое-нибудь другое представление. Для этого нам надо применить в любом месте обычного представления хелпер Html.Partial: @Html.Partial("Partial")
  • 38. http://www.slideshare.net/IgorShkulipa 38 Движок представлений и Razor При вызове метода View контроллер не производит рендеринг представления и не генерирует разметку html. Контроллер только готовит данные и выбирает, какое представление надо возвратить в качестве объекта ViewResult. Затем уже объект ViewResult обращается к движку представления для рендеринга представления в выходной результат. До MVC 3 использовался только движок Web Forms, который использовал стандартный синтаксис ASP.NET. <% foreach(var b in ViewBag.Books) { %> <li>Книга: <%: b.Name %></li> <% } %> Введение в MVC 3 движка Razor позволило уменьшить синтаксис при вызове кода C#, сделать код более "чистым". Аналогичный пример на Razor выгдядит так: @foreach(var b in ViewBag.Books) { <li>Книга: b.Name </li> } Важно понимать, что движок представлений, например, Razor - это не какой-то новый язык, это лишь способ рендеринга представлений, который имеет определенный синтаксис для перехода от разметки html к коду C#. Кроме движка Razor можно использовать и движки сторонних производителей.
  • 39. http://www.slideshare.net/IgorShkulipa 39 Основы синтаксиса Razor Использование синтаксиса Razor характеризуется тем, что перед выражением кода стоит знак @, после которого осуществляется переход к коду C#. Существуют два типа переходов: к выражениям кода и к блоку кода. Переход к выражению кода: <p>@b.Name</p> <h3>@DateTime.Now.ToShortTimeString()</h3> Применение блоков кода аналогично, только знак @ ставится перед всем блоком кода, а движок автоматически определяет, где этот блок кода заканчивается: @foreach (var b in Model) { <p>@b.Name</p> } Более того мы можем создавать блоки кода в представлении, создавать там переменные так же, как и в файле кода C#: @{ string head = "Привет мир!!!"; head = head + " Добро пожаловать на сайт!"; } <h3>@head</h3>
  • 40. http://www.slideshare.net/IgorShkulipa 40 HTML-хелперы Представления используют разметку html для визуализации содержимого. Однако фреймворк ASP.NET MVC обладает также таким мощным инструментом как HTML-хелперы, позволяющие генерировать html- код.
  • 41. http://www.slideshare.net/IgorShkulipa 41 Хелпер Html.BeginForm @using(Html.BeginForm("Buy", "Home", FormMethod.Post)) { <input type="hidden" value="@ViewBag.BookId" name="BookId" /> <table> <tr><td><p>Введите свое имя </p></td> <td><input type="text" name="Person" /> </td></tr> <tr><td><p>Введите адрес :</p></td> <td><input type="text" name="Address" /> </td></tr> <tr><td><input type="submit" value="Отправить" /> </td> <td></td></tr> </table> } Метод BeginForm принимает в качестве параметров имя метода действия и имя контроллера, а также тип запроса. Данный хелпер создает как открывающий тег <form>, так и закрывающий тег </form>. Поэтому при рендеринге представления в выходной поток у нас получится тот же самый html-код, что и с применением тега form.
  • 42. http://www.slideshare.net/IgorShkulipa 42 Другие хелперы • Хелпер Html.TextBox генерирует тег input со значением атрибута type равным text. • Хелпер Html.TextArea используется для создания элемента <textarea>, который представляет многострочное текстовое поле. • Вместо скрытого поля input type="hidden", можно использовать хелпер Html.Hidden. • Html.Password создает поле для ввода пароля. Он похож на хелпер TextBox, но вместо введенных символов отображает маску пароля. • Для создания переключателей применяется хелпер Html.RadioButton. Он генерирует элемент input со значением type="radio". • Html.CheckBox может применяться для создания чекбоксов • Хелпер Html.Label создает элемент <label/>, а передаваемый в хелпер параметр определяет значение атрибута for и одновременно текст на элементе. • Хелперы Html.DropDownList и Html.ListBox срздают DropDownList и ListBox.
  • 43. http://www.slideshare.net/IgorShkulipa 43 Шаблонные хелперы Кроме стандартных html-хелперов, фреймворк MVC также имеет шаблонные (шаблонизированные) хелперы Они более гибки по сравнению с html-хелперами, так как в этом случае нам не надо думать, какой нам надо создать элемент разметки и какой для этого выбрать хелпер. Мы просто сообщаем шаблонному хелперу, какое свойство модели мы хотим использовать, а фреймворк уже сам выбирает, какой html-элемент сгенерировать, исходя из типа свойства и его метаданных. Шаблонные хелперы: • Display. Создает элемент разметки, который доступен только для чтения, для указанного свойства модели: Html.Display("Name") • DisplayFor. Строго типизированный аналог хелпера Display: Html.DisplayFor(e => e.Name) • Editor. Создает элемент разметки, который доступен для редактирования, для указанного свойства модели: Html.Editor("Name") • EditorFor. Строго типизированный аналог хелпера Editor: Html.EditorFor(e => e.Name)
  • 45. http://www.slideshare.net/IgorShkulipa 45 Модели Данные моделей хранятся в базе данных. Чтобы взаимодействовать с базой данных, очень удобно пользоваться Entity Framework.
  • 46. http://www.slideshare.net/IgorShkulipa 46 Пример. Модель public class Position { public int ID { get; set; } public string Name { get; set; } } public class Persone { public int ID { get; set; } public string Surname { get; set; } public string Name { get; set; } public string Middle { get; set; } public string Login { get; set; } public string Password { get; set; } public string Email { get; set; } public int PosID { get; set; } } public class TeamContext : DbContext { public DbSet<Persone> Persones { get; set; } public DbSet<Position> Positions { get; set; } }
  • 47. http://www.slideshare.net/IgorShkulipa 47 Пример. Репозиторий public interface IRepository<T> { void Insert(T entity); void Delete(T entity); void Update(T entity, T newValue); IQueryable<T> SelectAll(); void SubmitAll(); } public class Repository<T> : IRepository<T> where T : class { protected DbContext DBContext; public Repository(DbContext dataContext) { DBContext = dataContext; } public void Insert(T entity) { DBContext.Set<T>().Add(entity); } public void Delete(T entity) { DBContext.Set<T>().Remove(entity); } public void Update(T entity, T newValue) { var entry = DBContext.Entry<T>(entity); entry.CurrentValues.SetValues(newValue); entry.State = EntityState.Modified; } public IQueryable<T> SelectAll() { return DBContext.Set<T>(); } public void SubmitAll() { DBContext.SaveChanges(); } }
  • 48. http://www.slideshare.net/IgorShkulipa 48 Пример. Модель <connectionStrings> <add name="TeamContext" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)v11.0; AttachDBFilename=|DataDirectory|Team.mdf" /> </connectionStrings>
  • 49. http://www.slideshare.net/IgorShkulipa 49 Пример. Контроллер public class HomeController : Controller { static TeamContext model =new TeamContext(); static IRepository<Persone> persons = new Repository<Persone>(model); static IRepository<Position> positions = new Repository<Position>(model); [HttpPost] public ActionResult NewPersone() { Persone newPer = new Persone(); newPer.Name = Request.Params["name"]; newPer.Middle = Request.Params["middle"]; newPer.Surname = Request.Params["surname"]; newPer.Login = Request.Params["login"]; newPer.Password = Request.Params["password"]; newPer.Email = Request.Params["email"]; newPer.PosID = Convert.ToInt32(Request.Params["Positions"]); newPer.ID = persons.SelectAll().Count<Persone>()+1; persons.Insert(newPer); persons.SubmitAll(); var list = new List<string>(); foreach (var pr in persons.SelectAll()) { string li = pr.ID.ToString()+" "+pr.Name+" "+pr.Middle+" "+pr.Surname; list.Add(li); } ViewData["Positions"] = list; return PartialView(list); }
  • 50. http://www.slideshare.net/IgorShkulipa 50 Пример. Контроллер public ActionResult Index() { ViewBag.Message = "Hello, World of MVC!"; ViewBag.Persons = new List<Persone>(); var list1 = new List<SelectListItem>(); foreach (var pr in positions.SelectAll()) { SelectListItem sli = new SelectListItem(); sli.Text = pr.Name; sli.Value = pr.ID.ToString(); sli.Selected = false; list1.Add(sli); } ViewData["Positions"] = list1; return View(); }
  • 51. http://www.slideshare.net/IgorShkulipa 51 Пример. Контроллер public ActionResult About() { ViewBag.Message = "Your app description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } }
  • 53. http://www.slideshare.net/IgorShkulipa 53 Пример. Представление. Index.cshtml @{ ViewBag.Title = "ASP.NET MVC Example 1"; } @section featured { <section class="featured"> <div class="content-wrapper"> <hgroup class="title"> <h1>@ViewBag.Title.</h1> <h2>@ViewBag.Message</h2> </hgroup> <p> </p> </div> </section> }
  • 54. http://www.slideshare.net/IgorShkulipa 54 Пример. Представление. Index.cshtml <table style="width:100%; border:solid 1px;"> <tr style="vertical-align:top;"> <td style="width: 50%; border: solid 1px;"> <form action="/Home/NewPersone" method="post"> <label >Name</label> @Html.TextBox("name") <label>Middle</label> @Html.TextBox("middle") <label>Surname</label> @Html.TextBox("surname") <label>Login</label> @Html.TextBox("login") <label>Password</label> @Html.Password("password") <label>e-mail</label> @Html.TextBox("email") @Html.DropDownList("Positions") <input type="submit" value="Add" /> </form> </td>
  • 55. http://www.slideshare.net/IgorShkulipa 55 Пример. Представление. Index.cshtml <td style="width: 50%; border: solid 1px; "> <table style="border:solid 1px; width:100%;"> @foreach (var item in ViewData["Persons"] as IEnumerable<MvcApplication1.Models.Persone>) { <tr style="border:solid 1px; width:100%;"> <td style="width: 5%; border: solid 1px;"> @Html.Encode(item.ID.ToString()) </td> <td style="width: 10%; border: solid 1px;"> @Html.Encode(item.Name) </td> <td style="width: 10%; border: solid 1px;"> @Html.Encode(item.Middle) </td> <td style="width: 10%; border: solid 1px;"> @Html.Encode(item.Surname) </td> <td style="width: 65%; border: solid 1px;"> @Html.Encode(item.Email.ToString()) </td> </tr> } </table> </td> </tr> </table>
  • 60. http://www.slideshare.net/IgorShkulipa 60 Лабораторная работа №9 Выполнить задание Лабораторной работы №1 с использованием Microsoft ASP.NET MVC.