60
Темы лекции: ASP.NET. MVC. Часть 1. Практическое задание: ASP.NET MVC. Тренер: Игорь Шкулипа, к.т.н. Разработка Веб-приложений на платформе Microsoft .NET Framework. Занятие 9

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

Embed Size (px)

Citation preview

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

Темы лекции: ASP.NET. MVC. Часть 1.

Практическое задание: ASP.NET MVC.

Тренер: Игорь Шкулипа, к.т.н.

Разработка Веб-приложений на платформе Microsoft .NET Framework.

Занятие 9

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

http://www.slideshare.net/IgorShkulipa 2

Шаблон MVC

Шаблон проектированияMVC разделяет работувеб-приложения на триотдельныефункциональные роли:

• модель данных(model)

• пользовательскийинтерфейс (view)

• управляющуюлогику (controller)

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

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

http://www.slideshare.net/IgorShkulipa 3

ASP.NET MVC

ASP.NET MVC представляет собой платформу для создания сайтов и веб-приложений с использованием паттерна (или шаблона) MVC (model -view - controller).

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

• Представление (view) - это визуальная часть или пользовательскийинтерфейс приложения - например, html-страница, через которуюпользователь, зашедший на сайт, взаимодействует с веб-приложением.

• Модель (model) представляет набор классов, описывающих логикуиспользуемых данных.

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

http://www.slideshare.net/IgorShkulipa 4

Общая схема работы

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

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.Поскольку она также имеет свои сильные стороны, например, модель событий,которая будет ближе тем разработчикам, которые ранее занимались созданиемклиентских приложений.

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

http://www.slideshare.net/IgorShkulipa 6

Шаблоны приложений MVC в Visual Studio

• Internet Application. Данный шаблон представляет некоторую базовуюфункциональность, например, управление учетными записями, которую будетсодержать новое приложение.

• Intranet Application. Данный шаблон похож на шаблон Internet Application.Отличие состоит в том, что в Intranet Application для управления учетнымизаписями используется аутентификация Windows, а не система ASP.NETMembership.

• Empty. Этот шаблон представляет абсолютно чистое приложение без каких-либофайлов и структуры папок.

• Basic. Этот шаблон также представляет пустой проект. Правда, он содержитбазовые каталоги, CSS, инфраструктуру приложения MVC. Ранее в MVC 3 этотшаблон назывался Empty.

• Mobile Application. Это новинка MVC 4, предназначенная для создания веб-приложений для мобильных платформ.

• Web API. Предназначен для создания сервисов и для работы с фреймворкомWeb API.

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

http://www.slideshare.net/IgorShkulipa 7

Шаблоны приложений MVC в Visual Studio

В дополнение к предыдущим проектам в обновлениях Visual Studio 2012 ив Visual Studio 2013 были добавлены еще два типа проектов:

• Single Page Application. Шаблон, предназначенный для созданиясайтов-одностраничников.

• Facebook Application. Предназначен для создания веб-приложенийпод социальную сеть Facebook.

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

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.

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

http://www.slideshare.net/IgorShkulipa 9

Структура проекта MVC

• Папки Images и Scripts. Папки Images и Scripts содержат соответственноизображения и скрипты на JavaScript, используемые в приложении. Поумолчанию эти папки уже содержат файлы, в частности, в папку Scriptsуже помещены файлы библиотеки jQuery.

• Models. Содержит модели, используемые приложением. По умолчаниюздесь определена одна модель - AccountModel, которая представляетотдельную учетную запись.

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

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

http://www.slideshare.net/IgorShkulipa 10

Контроллеры

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

http://www.slideshare.net/IgorShkulipa 11

КонтроллерыКонтроллер является центральным компонентом в архитектуре MVC. Контроллер

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

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

Чтобы обратиться контроллеру из веб-браузера, нам надо в адресной строке набратьадрес_сайта/Имя_контроллера/. Так, по запросу адрес_сайта/Home/ системамаршрутизации по умолчанию вызовет метод Index контроллера HomeControllerдля обработки входящего запроса. Если мы хотим отправить запрос кконкретному методу контроллера, то нужно указывать этот метод явно:адрес_сайта/Имя_контроллера/Метод_контроллера, например,адрес_сайта/Home/Buy - обращение к методу Buy контроллера HomeController.

Контроллер представляет обычный класс, который наследуется от базового классаSystem.Web.Mvc.Controller. В свою очередь класс Controller реализуетабстрактный базовый класс ControllerBase, а через него и интерфейсIController.

Таким образом, формально, чтобы создать свой класс контроллера, достаточносоздать класс, реализующий интерфейс IController и имеющий в именисуффикс Controller.

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

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-адрес.

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

http://www.slideshare.net/IgorShkulipa 13

Класс Controller

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

public class MyController : Controller

{

public ActionResult Index()

{

return View();

}

}

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

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!";

}

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

http://www.slideshare.net/IgorShkulipa 15

Получение входных данных

Стандартный get-запрос может принимать примерно следующую форму:

название_ресурса?параметр1=значение1&параметр2=значение2

То есть запрос к методу мог бы выглядеть так:

Home/Method?id=2.

Название параметров метода должно совпадать с названием параметров встроке запроса. Благодаря этому система сможет их автоматическисвязать.

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

Контроллер/Метод/id.

Последний параметр является опциональным. И благодаря этому мыможем передать параметр id и так:

Home/Method/2

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

http://www.slideshare.net/IgorShkulipa 16

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

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

Доступны следующие объекты контекста: Request, Response,RoutedData, HttpContext и Server.

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

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

http://www.slideshare.net/IgorShkulipa 17

Результаты действий

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

public abstract class ActionResult

{

public abstract void ExecuteResult(ControllerContext context);

}

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

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, указывая, что запрошенныйресурс не найден

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

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-страницы клиенту

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

http://www.slideshare.net/IgorShkulipa 20

ViewResult

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

Чтобы возвратить объект ViewResult используется метод View:

public class HomeController : Controller

{

public ActionResult Index()

{

return View();

}

}

Вызов метода View возвращает объект ViewResult. Затем уже ViewResultпроизводит рендеринг определенного представления в ответ. Поумолчанию контроллер производит поиск представления в проекте последующему пути:

/Views/Имя_контроллера/Имя_представления.cshtml

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

http://www.slideshare.net/IgorShkulipa 21

ViewResult

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

public class HomeController : Controller

{

public ViewResult SomeMethod()

{

return View("Index");

}

}

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

http://www.slideshare.net/IgorShkulipa 22

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

Существует два вида переадресации: временная и постоянная. И в зависимости отвида переадресации при ее выполнении сервер посылает браузерам один издвух кодов HTTP:

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

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

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

Для временной переадресации применяется метод Redirect:

return Redirect("/Home/Index");

Для постоянной переадресации подобным образом используется методRedirectPermanent:

return RedirectPermanent("/Home/Index");

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

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.

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

http://www.slideshare.net/IgorShkulipa 24

Отправка ошибок и статусных кодов

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

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

public ActionResult Check(int age)

{

if (age < 30)

{

return new HttpStatusCodeResult(404);

}

return View();

}

В качестве альтернативы также можно возвращать объектHttpNotFoundResult с помощью метода HttpNotFound

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

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.

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

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>

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

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, но и сложные данные.

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

http://www.slideshare.net/IgorShkulipa 28

Представления

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

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 папку спроизвольным именем, где будут храниться дополнительные представления,необязательно связанные с определенными методами контроллера.

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

http://www.slideshare.net/IgorShkulipa 30

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

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

http://www.slideshare.net/IgorShkulipa 31

Параметры представлений

• View Engine - выпадающий список для выбора движкапредставления. С ASP.NET MVC 4 данное диалоговое окноподдерживает несколько движков представлений. По умолчанию здесьпредставлены две возможности для выбора: Razor и ASPX. Но приустановке сторонних движков они также могут быть доступны длявыбора.

• Create a strongly-typed view - эта опция позволит создать строготипизированное представление. После ее выбора нужно будет указатьмодель в выпадающем списке, который содержит список всех моделей.Но чтобы все модели приложения можно было использовать, переддобавлением представления нужно скомпилировать проект.

• Scaffold template - опция позволяет выбрать шаблон формированиянового представления.

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

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. Однако, если вы хотитепереопределить мастер-страницу, то можете воспользоваться этой опцией.

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

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, и будетхранить переданные из контроллера данные.

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

http://www.slideshare.net/IgorShkulipa 34

Мастер-страницы

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

http://www.slideshare.net/IgorShkulipa 35

Мастер-страницы

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

Чтобы применить мастер-страницу к представлению, мы должны в секцииLayout указать путь к мастер-странице. Например, представлениеIndex.cshtml, использующее эту мастер-страницу, начинается так:

@{

Layout = "~/Views/Shared/_Layout.cshtml";

}

Если мастер-страница не используестся, то Layout = null;.

Мастер-страница может иметь несколько секций, куда представлениямогут поместить свое содержимое. Эти секции обрабатываютсяметодом RenderSection.

<footer>@RenderSection("Footer")</footer>

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

http://www.slideshare.net/IgorShkulipa 36

ViewStart

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

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

@{

Layout = "~/Views/Shared/_Layout.cshtml";

}

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

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

http://www.slideshare.net/IgorShkulipa 37

Частичные представления

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

За рендеринг частичных представлений отвечает объектPartialViewResult, который возвращается методом PartialView.

public ActionResult Partial()

{

return PartialView();

}

Чтобы встроить его в какое-нибудь другое представление. Для этого намнадо применить в любом месте обычного представления хелперHtml.Partial:

@Html.Partial("Partial")

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

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 можно использовать и движки сторонних производителей.

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

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>

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

http://www.slideshare.net/IgorShkulipa 40

HTML-хелперы

Представления используют разметку html для визуализации содержимого.Однако фреймворк ASP.NET MVC обладает также таким мощныминструментом как HTML-хелперы, позволяющие генерировать html-код.

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

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.

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

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.

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

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)

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

http://www.slideshare.net/IgorShkulipa 44

Модели

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

http://www.slideshare.net/IgorShkulipa 45

Модели

Данные моделей хранятся в базе данных. Чтобы взаимодействовать сбазой данных, очень удобно пользоваться Entity Framework.

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

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; }

}

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

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(); }

}

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

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>

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

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);

}

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

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();

}

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

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();

}

}

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

http://www.slideshare.net/IgorShkulipa 52

Пример. Представление

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

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>

}

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

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>

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

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>

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

http://www.slideshare.net/IgorShkulipa 56

Пример. Результат

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

http://www.slideshare.net/IgorShkulipa 57

Пример. Результат

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

http://www.slideshare.net/IgorShkulipa 58

Пример. Результат

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

http://www.slideshare.net/IgorShkulipa 59

Пример. Результат

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

http://www.slideshare.net/IgorShkulipa 60

Лабораторная работа №9

Выполнить задание Лабораторной работы №1 с использованием MicrosoftASP.NET MVC.