SlideShare a Scribd company logo
Темы лекции: ASP.NET. MVC. Часть 2.
Практическое задание: ASP.NET. MVC.
Тренер: Игорь Шкулипа, к.т.н.
Разработка Веб-приложений на платформе
Microsoft .NET Framework.
Занятие 10
http://www.slideshare.net/IgorShkulipa 2
Маршрутизация
http://www.slideshare.net/IgorShkulipa 3
Управление маршрутизацией
В MVC 3 для определения маршрута по умолчанию в файле Global.asax.cs
создавался специальный метод RegisterRoutes, который определял
маршрут по умолчанию и потом вызывался в методе Application_Start.
В MVC 4 все начальные настройки конфигурации для файла Global.asax.cs
вынесены в классы, расположенные в папке App_Start. И затем эти
классы вызываются в файле Global.asax.cs
http://www.slideshare.net/IgorShkulipa 4
RouteConfig
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional }
);
}
}
http://www.slideshare.net/IgorShkulipa 5
Запрещение маршрутов
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("Home/About");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional }
);
}
}
http://www.slideshare.net/IgorShkulipa 6
Создание собственных маршрутов
routes.MapRoute(
name: "MyRoute",
url: "{controller}/{action}/{param}",
defaults: new {
controller="Home",
action="Contact",
param=UrlParameter.Optional});
http://www.slideshare.net/IgorShkulipa 7
Создание ограничений для маршрутов
routes.MapRoute(
name: "MyRoute",
url: "{controller}/{action}/{param}",
defaults: new {
controller="Home",
action="Contact", param=UrlParameter.Optional},
constraints: new { param = @"d{3}" });
routes.MapRoute(
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index",
id = UrlParameter.Optional }
http://www.slideshare.net/IgorShkulipa 8
Области (Areas)
Несмотря на то, что проект MVC по умолчанию представляет собой четкую структуру
разделения на отдельные функциональные части - контроллеры, модели,
представления, иногда для более удобной работы над приложением, особенно
над большими приложениями, приложение делится на ряд областей (area).
Добавить в проект MVC область можно, кликнув правой кнопкой мыши на проект и в
появившемся меню выбрать Add->Area. В окне добавления области дадим
новой области название, например, General.
После этого в структуре проекта произойдет ряд изменений: в проект будет
добавлена новая папка Areas, в которую в свою очередь будет добавлена папка
General - непосредственно для новой области. Внутри папки General фактически
окажется мини-проект, в котором будут папки для контроллеров, моделей и
представлений и класс регистрации области.
http://www.slideshare.net/IgorShkulipa 9
Создание собственного обработчика маршрутов
Процесс маршрутизации состоит из следующих этапов:
• Модуль UrlRoutingModule пытается сопоставить текущий запрос
с маршрутами в таблице RouteTable.
• Если сопоставление завершилось удачно, то модуль
маршрутизации выбирает обработчик маршрутов сопоставленного
маршрута - объект IRouteHandler.
• Затем у объекта IRouteHandler вызывается метод GetHandler,
который возвращает объект IHttpHandler, используемый для
обработки запроса.
• У обработчика IHttpHandler вызывается метод ProcessRequest
для обработки запросов.
http://www.slideshare.net/IgorShkulipa 10
Создание собственного обработчика маршрутов
namespace Routing.RouteHandlers {
public class MyRouteHandler : IRouteHandler {
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
return new MyHttpHandler();
} }
public class MyHttpHandler : IHttpHandler {
public bool IsReusable {
get { return false; }
}
public void ProcessRequest(HttpContext context) {
context.Response.Write("Hello from Custom Route Handler");
} } }
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
//...
Route newRoute = new Route("{controller}/{action}", new MyRouteHandler());
routes.Add(newRoute);
}
}
http://www.slideshare.net/IgorShkulipa 11
Фильтры
http://www.slideshare.net/IgorShkulipa 12
Фильтры
Иногда возникает необходимость внести в приложение некоторую логику,
которая должна отрабатывать до вызова действий контроллера. В
частности, например, пользователь вызывает определенное действие
некоторого контроллера, и нам необходимо проверять, авторизовался
ли данный пользователь, и потом уже выполнять определенные
действия. Для этого и применяются фильтры.
Фильтры реализованы как атрибуты, благодаря чему позволяют
уменьшить объем кода в контроллере. Данные атрибуты могут
применяться как ко всему классу, так и к отдельным его методам,
свойствам и полям.
http://www.slideshare.net/IgorShkulipa 13
Базовые типы фильтров
При вызове метода действий фреймворк MVC сначала смотрит,
применяются ли к данному действию какие-либо атрибуты, и если
применяются, то в начале отрабатывают эти атрибуты.
Фильтры авторизации
Фильтр, определяющий, аутентифицирован ли
клиент и имеет ли он доступ к данному ресурсу.
Данный фильтр запускается до выполнения любого
другого фильтра или метода действий
Фильтры действий
Фильтр, применяемый к действиям. Может
запускаться как до, так и после выполнения
метода действий
Фильтры результатов
действий
Фильтр, применяемый к результатам действий.
Может запускаться как до, так и после выполнения
результата действия
Фильтры исключений
Атрибут для обработки исключений,
выбрасываемых методом действий и результатом
действий
http://www.slideshare.net/IgorShkulipa 14
Фильтры авторизации
[Authorize]
public ActionResult ForbiddenForNotAuth()
{
ContentResult cr = new ContentResult();
cr.Content = "If you see this message, you're a hacker!";
return cr;
}
http://www.slideshare.net/IgorShkulipa 15
Фильтры авторизации
[AllowAnonymous]
public ActionResult ForbiddenForNotAuth()
{
ContentResult cr = new ContentResult();
cr.Content = "If you see this message, you're a hacker!";
return cr;
}
http://www.slideshare.net/IgorShkulipa 16
Фильтры исключений
ExceptionType
Представляет тип обрабатываемого исключения. По
умолчанию используется System.Exception
View
Имя представления, которое рендерится данным
фильтром. Если значение не задано, то по
умолчанию используются следующие пути:
/Views/Имя_контроллера/Error.cshtml или
/Views/Shared/Error.cshtml
Master Имя используемой мастер-страницы
Для фильтрации исключений можно использовать фильтр HandleError.
Парметры фильтра HandleError:
http://www.slideshare.net/IgorShkulipa 17
Фильтры исключений
<system.web>
<customErrors mode="On" />
[HandleError(ExceptionType = typeof(System.IndexOutOfRangeException),
View = "Index Out of Range Filter")]
public ActionResult HandleIndexError()
{
int[] mas = new int[2];
mas[6] = 4;
ContentResult cr = new ContentResult();
cr.Content = "If you see this message, something gone wrong!";
return cr;
}
@{
ViewBag.Title = "ErrorFilter";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Error Filter Working Good!</h2>
http://www.slideshare.net/IgorShkulipa 18
Результат
http://www.slideshare.net/IgorShkulipa 19
Фильтры действий и результатов
Фильтры результатов позволяют проконтролировать входной контекст
запроса при доступе к действию, а также выполнить определенные
действия по завершению работы метода действий. Например, можно
изменить выходной результат метода.
Фильтр действий должен реализовать интерфейс IActionFilter:
public interface IActionFilter
{
void OnActionExecuting(ActionExecutingContext filterContext);
void OnActionExecuted(ActionExecutedContext filterContext);
}
Либо, нужно унаследовать новый фильтр от абстрактного класса
ActionFilterAttribute, который уже реализует интерфейс
IResultFilter:
public abstract class ActionFilterAttribute :
FilterAttribute, IActionFilter, IResultFilter
http://www.slideshare.net/IgorShkulipa 20
Пример. Фильтр
using System.Web.Mvc;
namespace MvcApplication1.Filters
{
public class CustomActionAttribute :
FilterAttribute, IActionFilter
{
public void OnActionExecuted(
ActionExecutedContext filterContext){
}
public void OnActionExecuting(
ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.Browser.Browser ==
"InternetExplorer") {
filterContext.HttpContext.Response.Write(
"You're using IE. Please, try another browser :)");
}
}
}
}
http://www.slideshare.net/IgorShkulipa 21
Пример. Контроллер
using MvcApplication1.Filters;
...
[CustomAction]
public ActionResult Index()
{
...
}
http://www.slideshare.net/IgorShkulipa 22
Результат
http://www.slideshare.net/IgorShkulipa 23
Привязка модели
http://www.slideshare.net/IgorShkulipa 24
Строго типизированные представления
Метод привязки модели заключается в использовании строго типизированных
представлений. Подобные представления позволяют передавать данные не
через объект ViewBag, а напрямую в представление через параметр метода View.
Код метода контроллера мог бы выглядеть так:
[HttpGet]
public ActionResult ModelBind()
{
var viewModel =
positions.SelectAll().ToList<Position>();
if (viewModel != null)
{
return View(viewModel);
}
return View();
}
Чтобы связать представление с передаваемым параметром, надо добавить в
представление директиву @model с указанием типа передаваемых данных.
@model List<MvcApplication1.Models.Position>
Объект Model представляет тип модели, указанной в директиве @model, и будет
хранить переданные из контроллера данные.
http://www.slideshare.net/IgorShkulipa 25
Диалог создания строго-типизированного
представления
http://www.slideshare.net/IgorShkulipa 26
Пример. Немного обновленные классы модели
public class TEntity
{
public int ID { get; set; }
}
public class Position: TEntity
{
//public int ID { get; set; }
...
}
public class Persone : TEntity
{
//public int ID { get; set; }
...
}
http://www.slideshare.net/IgorShkulipa 27
Пример. Немного обновленный репозиторий
public interface IRepository<T> {
void Insert(T entity);
void Delete(T entity);
void Update(T entity, T newValue);
IQueryable<T> SelectAll();
T Select(int id);
void SubmitAll();
}
public class Repository<T> : IRepository<T> where T : Tentity {
...
public T Select(int id) {
var res = from d in DBContext.Set<T>()
where d.ID.Equals(id)
select d;
if (res.Count<T>() > 0) {
return res.ToList<T>()[0];
}
else {
return null;
}
}
}
http://www.slideshare.net/IgorShkulipa 28
Частичное строго-типизированное представление
EditOnePosition.cshtml
@model MvcApplication1.Models.Position
@using (Html.BeginForm("ModelBindPost", "Home", Model,
FormMethod.Post))
{
<fieldset>
@Html.HiddenFor(it => it.ID)
@Html.Label("Название должности")
<br />
@Html.EditorFor(it => it.Name)
<input type="submit" value="Обновить" />
</fieldset>
}
http://www.slideshare.net/IgorShkulipa 29
Представление. ModelBind.cshtml
@model List<MvcApplication1.Models.Position>
@{
ViewBag.Title = "ModelBind";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>@ViewBag.Title </h2>
@for (int i = 0; i < Model.Count; i++)
{
@Html.Partial("EditOnePosition", Model[i])
}
http://www.slideshare.net/IgorShkulipa 30
Пример. Методы контроллера
[HttpGet]
public ActionResult ModelBind()
{
var viewModel = positions.SelectAll().ToList<Position>();
if (viewModel != null)
{
return View(viewModel);
}
return View();
}
[HttpPost]
public ActionResult ModelBindPost(Position pos)
{
Position p = positions.Select(pos.ID);
positions.Update(p, pos);
positions.SubmitAll();
return RedirectToAction("ModelBind");
}
http://www.slideshare.net/IgorShkulipa 31
Результат
http://www.slideshare.net/IgorShkulipa 32
Валидация модели
http://www.slideshare.net/IgorShkulipa 33
Валидация модели. Модель и представление
public class TEntity
{
[HiddenInput(DisplayValue = false)]
public int ID { get; set; }
}
public class Position: TEntity
{
[Required]
[Display(Name="Название должности")]
[Editable(true)]
[MaxLength(200,
ErrorMessageResourceType = typeof(Resources.Strings),
ErrorMessageResourceName = "MaxLengthErrorMessage")]
public string Name { get; set; }
}
@model MvcApplication1.Models.Position
@using (Html.BeginForm("ModelBindPost", "Home", Model, FormMethod.Post))
{
<fieldset>
@Html.EditorForModel()
<input type="submit" value="Обновить" />
</fieldset>
}
http://www.slideshare.net/IgorShkulipa 34
Валидация модели. Контроллер
[HttpPost]
public ActionResult ModelBindPost(Position pos)
{
if (ModelState.IsValid)
{
Position p = positions.Select(pos.ID);
positions.Update(p, pos);
positions.SubmitAll();
}
return RedirectToAction("ModelBind");
}
http://www.slideshare.net/IgorShkulipa 35
Результат
http://www.slideshare.net/IgorShkulipa 36
Авторизация и аутентификация
http://www.slideshare.net/IgorShkulipa 37
Авторизация и аутентификация в MVC
Кроме аутентификации с помощью форм и с помощью Windows,
управление пользователями, членством и ролям производится с
помощью провайдеров членства и ролей.
В MVC 4 можно использовать различные провайдеры: как в виде API
SimpleMembershipProvider, так и в виде универсальных
провайдеров.
При необходимости среда ASP.NET MVC позволяет создавать и
использовать свои провайдеры членства/ролей и профилей со своей
уникальной логикой.
http://www.slideshare.net/IgorShkulipa 38
Авторизация и аутентификация в MVC
При создании проекта Internet Application, MVC генерирует базовую
функциональность для регистрации и авторизации пользователей.
http://www.slideshare.net/IgorShkulipa 39
Настройка SimpleMembershipProvider
SimpleMembershipProvider является довольно гибким классом и его
использовать довольно легко.
Так мы можем переопределить таблицу пользователей, которая по
умолчанию называется UserProfile и ее определение. Например, мы
можем создать в базе данных таблицу и использовать ее в качестве
хранилища данных пользователей, потому что стандартная таблица
хранит только логины и id пользователей, а нам захотелось ее
расширить: например, чтобы пользователь в качестве логина
использовал email, а также добавить в таблицу ряд дополнительных
столбцов.
Ссылка на описание класса SimpleMembershipProvider
http://www.slideshare.net/IgorShkulipa 40
Создание собственных провайдеров
Переопределение провайдера ролей
Чтобы переопределить провайдер ролей. нам надо создать класс,
производный от RoleProvider. И добавить в папку Providers новый
класс (например его CustomRoleProvider)
http://msdn.microsoft.com/en-us/library/8fw7xh74%28v=vs.100%29.aspx
Создание своих провайдеров членства
Переопределение членства предполагает, что мы должны переопределить
методы абстрактного класса MembershipProvider, который лежит в
основе провайдеров членства.
http://msdn.microsoft.com/en-us/library/44w5aswa%28v=vs.100%29.aspx
http://www.slideshare.net/IgorShkulipa 41
Настройка пользователей
http://www.slideshare.net/IgorShkulipa 42
AccountModels.cs
public class RegisterModel {
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[StringLength(100, ErrorMessage =
"The {0} must be at least {2} characters long.",
MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage =
"The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
[Required]
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Middle")]
public string Middle { get; set; }
[Required]
[Display(Name = "Surname")]
public string Surname { get; set; }
}
http://www.slideshare.net/IgorShkulipa 43
Register.cshtml
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<fieldset>
<legend>Registration Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
</li>
<li>
@Html.LabelFor(m => m.ConfirmPassword)
@Html.PasswordFor(m => m.ConfirmPassword)
</li>
</ol>
<input type="submit" value="Register" />
</fieldset>
} @using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary()
<fieldset>
<legend>Registration Form</legend>
@Html.EditorForModel()
<input type="submit" value="Register" />
</fieldset>
}
http://www.slideshare.net/IgorShkulipa 44
Результат
http://www.slideshare.net/IgorShkulipa 45
OAuth-аутентификация
В современном мире велика популярность различных социальных
сервисов и соцсетей - google+, twitter, facebook и т.д. Это привело
разработчиков к мысли использовать в качестве логина на сайт
учетную запись в данных сервисах и соцсетях.
До MVC 4 это сложно было сделать. Но в MVC 4 появились
соответствующие механизмы, которые позволяют предельно упростить
аутентификацию с помощью соцсетей.
В ряде случаев нам надо будет зарегистрировать свое приложение в
социальных сервисах, чтобы воспользоваться возможностью подобной
авторизации (как например в Facebook). А некоторые сервисы
позволяют использовать возможность аутентификации на основе
социальных сервисов без регистрации.
http://www.slideshare.net/IgorShkulipa 46
AuthConfig.cs
http://www.slideshare.net/IgorShkulipa 47
Результат
http://www.slideshare.net/IgorShkulipa 48
Аутентификация Facebook
http://www.slideshare.net/IgorShkulipa 49
Получение Facebook App ID
http://developers.facebook.com/
http://www.slideshare.net/IgorShkulipa 50
Получение Facebook App ID
http://www.slideshare.net/IgorShkulipa 51
Результат
http://www.slideshare.net/IgorShkulipa 52
Лабораторная работа №10
К лабораторной работе №9 добавить возможность регистрации,
авторизации и валидацию модели

More Related Content

PDF
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
PDF
C# Web. Занятие 02.
DOCX
10 hewan langka di indonesia
PDF
Print Brochure 3NM v6
PDF
Company | How it works
PPTX
power point of extra material about eye trauma
PDF
JavaScript Базовый. Занятие 11.
PDF
C# Web. Занятие 15.
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
C# Web. Занятие 02.
10 hewan langka di indonesia
Print Brochure 3NM v6
Company | How it works
power point of extra material about eye trauma
JavaScript Базовый. Занятие 11.
C# Web. Занятие 15.

Viewers also liked (19)

DOCX
Trabajo completo
PDF
C++ Базовый. Занятие 11.
PPTX
Production diary 9
PDF
PPC Masters February 2015
PDF
PDF
C++ Базовый. Занятие 06.
PPTX
Energías limpias
PDF
Brochure – Massey University Business School
PPTX
5 niveles de prevension
PPTX
What is Lean UX?
DOCX
Trabajo completo correcion
PDF
Your Five Senses
PDF
C# Desktop. Занятие 02.
DOC
Amarnath_Kushwaha_SWEngg_3yrs_exp_C_C++
POT
Simon Elliott
PDF
C# Web. Занятие 07.
PPTX
XDAQ
 
Trabajo completo
C++ Базовый. Занятие 11.
Production diary 9
PPC Masters February 2015
C++ Базовый. Занятие 06.
Energías limpias
Brochure – Massey University Business School
5 niveles de prevension
What is Lean UX?
Trabajo completo correcion
Your Five Senses
C# Desktop. Занятие 02.
Amarnath_Kushwaha_SWEngg_3yrs_exp_C_C++
Simon Elliott
C# Web. Занятие 07.
XDAQ
 
Ad

Similar to C# Web. Занятие 10. (20)

PPTX
Референсная архитектура приложения на ASP.NET MVC
PDF
Шаблоны проектирования в Magento
PDF
C# Web. Занятие 09.
PDF
Контейнер сервисов
PDF
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
PDF
C# Web. Занятие 01.
PPTX
Java осень 2012 лекция 9
PDF
C# Web. Занятие 11.
PPTX
АРК-ПЗ-1.pptx
PDF
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
PPTX
Enterprise flex pure mvc, slides, russian
PDF
C# Desktop. Занятие 06.
PDF
C# Desktop. Занятие 08.
PPTX
ASP.NET, MVC, ASP.NET MVC
PDF
WordCamp Russia 2015: Фильтры и события в WordPress.
PPT
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
PDF
C++ STL & Qt. Занятие 02.
PDF
The Old New ASP.NET
PPTX
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
PDF
C++ STL & Qt. Занятие 08.
Референсная архитектура приложения на ASP.NET MVC
Шаблоны проектирования в Magento
C# Web. Занятие 09.
Контейнер сервисов
Руслан Ханов, «Контейнер сервисов — Что? Где? Когда?»
C# Web. Занятие 01.
Java осень 2012 лекция 9
C# Web. Занятие 11.
АРК-ПЗ-1.pptx
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Enterprise flex pure mvc, slides, russian
C# Desktop. Занятие 06.
C# Desktop. Занятие 08.
ASP.NET, MVC, ASP.NET MVC
WordCamp Russia 2015: Фильтры и события в WordPress.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
C++ STL & Qt. Занятие 02.
The Old New ASP.NET
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
C++ STL & Qt. Занятие 08.
Ad

More from Igor Shkulipa (20)

PDF
Общие темы. Тема 03.
PDF
Общие темы. Тема 02.
PDF
Общие темы. Тема 01.
PDF
JavaScript Базовый. Занятие 06.
PDF
JavaScript Базовый. Занятие 09.
PDF
JavaScript Базовый. Занятие 10.
PDF
JavaScript Базовый. Занятие 05.
PDF
JavaScript Базовый. Занятие 08.
PDF
JavaScript Базовый. Занятие 07.
PDF
JavaScript Базовый. Занятие 01.
PDF
JavaScript Базовый. Занятие 04.
PDF
JavaScript Базовый. Занятие 03.
PDF
JavaScript Базовый. Занятие 02.
PDF
C# Web. Занятие 08.
PDF
C# Web. Занятие 04.
PDF
C# Web. Занятие 12.
PDF
C# Web. Занятие 16.
PDF
C# Web. Занятие 14.
PDF
C# Web. Занятие 13.
PDF
C# Web. Занятие 05.
Общие темы. Тема 03.
Общие темы. Тема 02.
Общие темы. Тема 01.
JavaScript Базовый. Занятие 06.
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 10.
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 02.
C# Web. Занятие 08.
C# Web. Занятие 04.
C# Web. Занятие 12.
C# Web. Занятие 16.
C# Web. Занятие 14.
C# Web. Занятие 13.
C# Web. Занятие 05.

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

  • 1. Темы лекции: ASP.NET. MVC. Часть 2. Практическое задание: ASP.NET. MVC. Тренер: Игорь Шкулипа, к.т.н. Разработка Веб-приложений на платформе Microsoft .NET Framework. Занятие 10
  • 3. http://www.slideshare.net/IgorShkulipa 3 Управление маршрутизацией В MVC 3 для определения маршрута по умолчанию в файле Global.asax.cs создавался специальный метод RegisterRoutes, который определял маршрут по умолчанию и потом вызывался в методе Application_Start. В MVC 4 все начальные настройки конфигурации для файла Global.asax.cs вынесены в классы, расположенные в папке App_Start. И затем эти классы вызываются в файле Global.asax.cs
  • 4. http://www.slideshare.net/IgorShkulipa 4 RouteConfig public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
  • 5. http://www.slideshare.net/IgorShkulipa 5 Запрещение маршрутов public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("Home/About"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
  • 6. http://www.slideshare.net/IgorShkulipa 6 Создание собственных маршрутов routes.MapRoute( name: "MyRoute", url: "{controller}/{action}/{param}", defaults: new { controller="Home", action="Contact", param=UrlParameter.Optional});
  • 7. http://www.slideshare.net/IgorShkulipa 7 Создание ограничений для маршрутов routes.MapRoute( name: "MyRoute", url: "{controller}/{action}/{param}", defaults: new { controller="Home", action="Contact", param=UrlParameter.Optional}, constraints: new { param = @"d{3}" }); routes.MapRoute( name: "Default", url: "{controller}/{action}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  • 8. http://www.slideshare.net/IgorShkulipa 8 Области (Areas) Несмотря на то, что проект MVC по умолчанию представляет собой четкую структуру разделения на отдельные функциональные части - контроллеры, модели, представления, иногда для более удобной работы над приложением, особенно над большими приложениями, приложение делится на ряд областей (area). Добавить в проект MVC область можно, кликнув правой кнопкой мыши на проект и в появившемся меню выбрать Add->Area. В окне добавления области дадим новой области название, например, General. После этого в структуре проекта произойдет ряд изменений: в проект будет добавлена новая папка Areas, в которую в свою очередь будет добавлена папка General - непосредственно для новой области. Внутри папки General фактически окажется мини-проект, в котором будут папки для контроллеров, моделей и представлений и класс регистрации области.
  • 9. http://www.slideshare.net/IgorShkulipa 9 Создание собственного обработчика маршрутов Процесс маршрутизации состоит из следующих этапов: • Модуль UrlRoutingModule пытается сопоставить текущий запрос с маршрутами в таблице RouteTable. • Если сопоставление завершилось удачно, то модуль маршрутизации выбирает обработчик маршрутов сопоставленного маршрута - объект IRouteHandler. • Затем у объекта IRouteHandler вызывается метод GetHandler, который возвращает объект IHttpHandler, используемый для обработки запроса. • У обработчика IHttpHandler вызывается метод ProcessRequest для обработки запросов.
  • 10. http://www.slideshare.net/IgorShkulipa 10 Создание собственного обработчика маршрутов namespace Routing.RouteHandlers { public class MyRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new MyHttpHandler(); } } public class MyHttpHandler : IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { context.Response.Write("Hello from Custom Route Handler"); } } } public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { //... Route newRoute = new Route("{controller}/{action}", new MyRouteHandler()); routes.Add(newRoute); } }
  • 12. http://www.slideshare.net/IgorShkulipa 12 Фильтры Иногда возникает необходимость внести в приложение некоторую логику, которая должна отрабатывать до вызова действий контроллера. В частности, например, пользователь вызывает определенное действие некоторого контроллера, и нам необходимо проверять, авторизовался ли данный пользователь, и потом уже выполнять определенные действия. Для этого и применяются фильтры. Фильтры реализованы как атрибуты, благодаря чему позволяют уменьшить объем кода в контроллере. Данные атрибуты могут применяться как ко всему классу, так и к отдельным его методам, свойствам и полям.
  • 13. http://www.slideshare.net/IgorShkulipa 13 Базовые типы фильтров При вызове метода действий фреймворк MVC сначала смотрит, применяются ли к данному действию какие-либо атрибуты, и если применяются, то в начале отрабатывают эти атрибуты. Фильтры авторизации Фильтр, определяющий, аутентифицирован ли клиент и имеет ли он доступ к данному ресурсу. Данный фильтр запускается до выполнения любого другого фильтра или метода действий Фильтры действий Фильтр, применяемый к действиям. Может запускаться как до, так и после выполнения метода действий Фильтры результатов действий Фильтр, применяемый к результатам действий. Может запускаться как до, так и после выполнения результата действия Фильтры исключений Атрибут для обработки исключений, выбрасываемых методом действий и результатом действий
  • 14. http://www.slideshare.net/IgorShkulipa 14 Фильтры авторизации [Authorize] public ActionResult ForbiddenForNotAuth() { ContentResult cr = new ContentResult(); cr.Content = "If you see this message, you're a hacker!"; return cr; }
  • 15. http://www.slideshare.net/IgorShkulipa 15 Фильтры авторизации [AllowAnonymous] public ActionResult ForbiddenForNotAuth() { ContentResult cr = new ContentResult(); cr.Content = "If you see this message, you're a hacker!"; return cr; }
  • 16. http://www.slideshare.net/IgorShkulipa 16 Фильтры исключений ExceptionType Представляет тип обрабатываемого исключения. По умолчанию используется System.Exception View Имя представления, которое рендерится данным фильтром. Если значение не задано, то по умолчанию используются следующие пути: /Views/Имя_контроллера/Error.cshtml или /Views/Shared/Error.cshtml Master Имя используемой мастер-страницы Для фильтрации исключений можно использовать фильтр HandleError. Парметры фильтра HandleError:
  • 17. http://www.slideshare.net/IgorShkulipa 17 Фильтры исключений <system.web> <customErrors mode="On" /> [HandleError(ExceptionType = typeof(System.IndexOutOfRangeException), View = "Index Out of Range Filter")] public ActionResult HandleIndexError() { int[] mas = new int[2]; mas[6] = 4; ContentResult cr = new ContentResult(); cr.Content = "If you see this message, something gone wrong!"; return cr; } @{ ViewBag.Title = "ErrorFilter"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Error Filter Working Good!</h2>
  • 19. http://www.slideshare.net/IgorShkulipa 19 Фильтры действий и результатов Фильтры результатов позволяют проконтролировать входной контекст запроса при доступе к действию, а также выполнить определенные действия по завершению работы метода действий. Например, можно изменить выходной результат метода. Фильтр действий должен реализовать интерфейс IActionFilter: public interface IActionFilter { void OnActionExecuting(ActionExecutingContext filterContext); void OnActionExecuted(ActionExecutedContext filterContext); } Либо, нужно унаследовать новый фильтр от абстрактного класса ActionFilterAttribute, который уже реализует интерфейс IResultFilter: public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
  • 20. http://www.slideshare.net/IgorShkulipa 20 Пример. Фильтр using System.Web.Mvc; namespace MvcApplication1.Filters { public class CustomActionAttribute : FilterAttribute, IActionFilter { public void OnActionExecuted( ActionExecutedContext filterContext){ } public void OnActionExecuting( ActionExecutingContext filterContext) { if (filterContext.HttpContext.Request.Browser.Browser == "InternetExplorer") { filterContext.HttpContext.Response.Write( "You're using IE. Please, try another browser :)"); } } } }
  • 21. http://www.slideshare.net/IgorShkulipa 21 Пример. Контроллер using MvcApplication1.Filters; ... [CustomAction] public ActionResult Index() { ... }
  • 24. http://www.slideshare.net/IgorShkulipa 24 Строго типизированные представления Метод привязки модели заключается в использовании строго типизированных представлений. Подобные представления позволяют передавать данные не через объект ViewBag, а напрямую в представление через параметр метода View. Код метода контроллера мог бы выглядеть так: [HttpGet] public ActionResult ModelBind() { var viewModel = positions.SelectAll().ToList<Position>(); if (viewModel != null) { return View(viewModel); } return View(); } Чтобы связать представление с передаваемым параметром, надо добавить в представление директиву @model с указанием типа передаваемых данных. @model List<MvcApplication1.Models.Position> Объект Model представляет тип модели, указанной в директиве @model, и будет хранить переданные из контроллера данные.
  • 25. http://www.slideshare.net/IgorShkulipa 25 Диалог создания строго-типизированного представления
  • 26. http://www.slideshare.net/IgorShkulipa 26 Пример. Немного обновленные классы модели public class TEntity { public int ID { get; set; } } public class Position: TEntity { //public int ID { get; set; } ... } public class Persone : TEntity { //public int ID { get; set; } ... }
  • 27. http://www.slideshare.net/IgorShkulipa 27 Пример. Немного обновленный репозиторий public interface IRepository<T> { void Insert(T entity); void Delete(T entity); void Update(T entity, T newValue); IQueryable<T> SelectAll(); T Select(int id); void SubmitAll(); } public class Repository<T> : IRepository<T> where T : Tentity { ... public T Select(int id) { var res = from d in DBContext.Set<T>() where d.ID.Equals(id) select d; if (res.Count<T>() > 0) { return res.ToList<T>()[0]; } else { return null; } } }
  • 28. http://www.slideshare.net/IgorShkulipa 28 Частичное строго-типизированное представление EditOnePosition.cshtml @model MvcApplication1.Models.Position @using (Html.BeginForm("ModelBindPost", "Home", Model, FormMethod.Post)) { <fieldset> @Html.HiddenFor(it => it.ID) @Html.Label("Название должности") <br /> @Html.EditorFor(it => it.Name) <input type="submit" value="Обновить" /> </fieldset> }
  • 29. http://www.slideshare.net/IgorShkulipa 29 Представление. ModelBind.cshtml @model List<MvcApplication1.Models.Position> @{ ViewBag.Title = "ModelBind"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>@ViewBag.Title </h2> @for (int i = 0; i < Model.Count; i++) { @Html.Partial("EditOnePosition", Model[i]) }
  • 30. http://www.slideshare.net/IgorShkulipa 30 Пример. Методы контроллера [HttpGet] public ActionResult ModelBind() { var viewModel = positions.SelectAll().ToList<Position>(); if (viewModel != null) { return View(viewModel); } return View(); } [HttpPost] public ActionResult ModelBindPost(Position pos) { Position p = positions.Select(pos.ID); positions.Update(p, pos); positions.SubmitAll(); return RedirectToAction("ModelBind"); }
  • 33. http://www.slideshare.net/IgorShkulipa 33 Валидация модели. Модель и представление public class TEntity { [HiddenInput(DisplayValue = false)] public int ID { get; set; } } public class Position: TEntity { [Required] [Display(Name="Название должности")] [Editable(true)] [MaxLength(200, ErrorMessageResourceType = typeof(Resources.Strings), ErrorMessageResourceName = "MaxLengthErrorMessage")] public string Name { get; set; } } @model MvcApplication1.Models.Position @using (Html.BeginForm("ModelBindPost", "Home", Model, FormMethod.Post)) { <fieldset> @Html.EditorForModel() <input type="submit" value="Обновить" /> </fieldset> }
  • 34. http://www.slideshare.net/IgorShkulipa 34 Валидация модели. Контроллер [HttpPost] public ActionResult ModelBindPost(Position pos) { if (ModelState.IsValid) { Position p = positions.Select(pos.ID); positions.Update(p, pos); positions.SubmitAll(); } return RedirectToAction("ModelBind"); }
  • 37. http://www.slideshare.net/IgorShkulipa 37 Авторизация и аутентификация в MVC Кроме аутентификации с помощью форм и с помощью Windows, управление пользователями, членством и ролям производится с помощью провайдеров членства и ролей. В MVC 4 можно использовать различные провайдеры: как в виде API SimpleMembershipProvider, так и в виде универсальных провайдеров. При необходимости среда ASP.NET MVC позволяет создавать и использовать свои провайдеры членства/ролей и профилей со своей уникальной логикой.
  • 38. http://www.slideshare.net/IgorShkulipa 38 Авторизация и аутентификация в MVC При создании проекта Internet Application, MVC генерирует базовую функциональность для регистрации и авторизации пользователей.
  • 39. http://www.slideshare.net/IgorShkulipa 39 Настройка SimpleMembershipProvider SimpleMembershipProvider является довольно гибким классом и его использовать довольно легко. Так мы можем переопределить таблицу пользователей, которая по умолчанию называется UserProfile и ее определение. Например, мы можем создать в базе данных таблицу и использовать ее в качестве хранилища данных пользователей, потому что стандартная таблица хранит только логины и id пользователей, а нам захотелось ее расширить: например, чтобы пользователь в качестве логина использовал email, а также добавить в таблицу ряд дополнительных столбцов. Ссылка на описание класса SimpleMembershipProvider
  • 40. http://www.slideshare.net/IgorShkulipa 40 Создание собственных провайдеров Переопределение провайдера ролей Чтобы переопределить провайдер ролей. нам надо создать класс, производный от RoleProvider. И добавить в папку Providers новый класс (например его CustomRoleProvider) http://msdn.microsoft.com/en-us/library/8fw7xh74%28v=vs.100%29.aspx Создание своих провайдеров членства Переопределение членства предполагает, что мы должны переопределить методы абстрактного класса MembershipProvider, который лежит в основе провайдеров членства. http://msdn.microsoft.com/en-us/library/44w5aswa%28v=vs.100%29.aspx
  • 42. http://www.slideshare.net/IgorShkulipa 42 AccountModels.cs public class RegisterModel { [Required] [Display(Name = "User name")] public string UserName { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } [Required] [Display(Name = "Name")] public string Name { get; set; } [Display(Name = "Middle")] public string Middle { get; set; } [Required] [Display(Name = "Surname")] public string Surname { get; set; } }
  • 43. http://www.slideshare.net/IgorShkulipa 43 Register.cshtml @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary() <fieldset> <legend>Registration Form</legend> <ol> <li> @Html.LabelFor(m => m.UserName) @Html.TextBoxFor(m => m.UserName) </li> <li> @Html.LabelFor(m => m.Password) @Html.PasswordFor(m => m.Password) </li> <li> @Html.LabelFor(m => m.ConfirmPassword) @Html.PasswordFor(m => m.ConfirmPassword) </li> </ol> <input type="submit" value="Register" /> </fieldset> } @using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary() <fieldset> <legend>Registration Form</legend> @Html.EditorForModel() <input type="submit" value="Register" /> </fieldset> }
  • 45. http://www.slideshare.net/IgorShkulipa 45 OAuth-аутентификация В современном мире велика популярность различных социальных сервисов и соцсетей - google+, twitter, facebook и т.д. Это привело разработчиков к мысли использовать в качестве логина на сайт учетную запись в данных сервисах и соцсетях. До MVC 4 это сложно было сделать. Но в MVC 4 появились соответствующие механизмы, которые позволяют предельно упростить аутентификацию с помощью соцсетей. В ряде случаев нам надо будет зарегистрировать свое приложение в социальных сервисах, чтобы воспользоваться возможностью подобной авторизации (как например в Facebook). А некоторые сервисы позволяют использовать возможность аутентификации на основе социальных сервисов без регистрации.
  • 49. http://www.slideshare.net/IgorShkulipa 49 Получение Facebook App ID http://developers.facebook.com/
  • 52. http://www.slideshare.net/IgorShkulipa 52 Лабораторная работа №10 К лабораторной работе №9 добавить возможность регистрации, авторизации и валидацию модели