SlideShare a Scribd company logo
Андрей Кулешов




ASP.NET, MVC,
ASP.NET MVC
История, паттерны, реализация
История
▪ В 1991 появляется первый стандарт языка разметки HTML – Hyper Text
  Markup Language
▪ В следующее десятилетие наблюдается взрывной рост количества веб-
  серверов (как программного обеспечения, так и машин, обслуживающих
  запросы), веб-браузеров, веб-стандартов
▪ От серверов, отдающих статическое содержимое (файлы на жестком диске)
  – к динамическому содержимому (когда возвращаемый результат был
  результатом работы программы)
▪ Январь 2002 – релиз ASP.NET Web Forms (вместе с .NET как таковым)
Почему перестало хватать Web Forms?
▪ ASP.NET – хорошая программная платформа, созданная десятилетие назад
• Одно из декларированных преимуществ – не нужно учить HTML – мы кидаем на
  страницу контролы (привет, разработчики Visual Basic) и всѐ автомагически
  происходит на сервере
• Потому что в далекие времена ничего хорошего на клиенте происходить не
  могло
• Высокая сложность клиентского кода – у каждого браузера свой диалект
  JavaScript (он же LiveScript, он же JScript, и всѐ это станет стандартом
  ECMAScript), своя DOM, и нет никаких распространенных фреймворков,
  позволяющих абстрагироваться от этих различий
• Обмен данными между клиентом и сервером идѐт строго по схеме GET – POST
  (и разработчикам Web Forms даже не надо знать этих слов)
Что случилось?
▪ AJAX
▪ Стандартизация
▪ JavaScript фреймворки (jQuery, Yahoo)
▪ Расширение возможностей браузеров
▪ Распространение unit-тестирования
Люди, желавшие странного...
▪ Лучший контроль над генерируемой HTML-разметкой
▪ Лучшие возможности для создание скриптов на клиенте
▪ Больше возможностей для юнит-тестирования логики
Демо
MVC для ASP.NET своими руками
Единая точка входа запросов
▪ Все запросы перенаправляются на центральный IHttpHandler
▪ Если по запрошенному пути существуют физический файл на диске, то
  сервер возвращает этот файл
▪ Иначе – запрос обрабатывается согласно правилам роутинга
Сферический MVC в ваакуме
▪ Model-view-controller (MVC, «Модель-представление-поведение», «Модель-
  представление-контроллер») — архитектура программного обеспечения, в которой
  модель данных приложения, пользовательский интерфейс и управляющая логика
  разделены на три отдельных компонента, так, что модификация одного из компонентов
  оказывает минимальное воздействие на другие компоненты.

• Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на
  запросы (обычно от контроллера), изменяя своѐ состояние.

• Представление (View). Отвечает за отображение информации (пользовательский
  интерфейс).

• Контроллер(Controller). Интерпретирует данные, введѐнные пользователем, и
  информирует модель и представление о необходимости соответствующей реакции.

- модель независима от визуального представления

- для одной и той же модели можно создавать различные представления
Явление ASP.NET MVC народу
▪ Прототип придуман в феврале 2007 года Скоттом Гуфри, на борту самолета,
  на котором тот летел на конференцию на восточное побережье США
▪ Впервые показан в октябре 2007 года, где вызвал интерес и желание
  продолжать
▪ ASP.NET MVC CTP – декабрь 2007
▪ Первый релиз в марте 2009
▪ Последний стабильный релиз – MVC 4 – август 2012 г.
Демо
Проект ASP.NET MVC
Separation of Concerns
Разделение ответственности
Предназначено для того, чтобы сделать код более
Configuration over Convention
▪ Есть ряд простых правил (именования файлов и классов, размещения их
  внутри папок), следуя которым, вы просто подключаете ваш код (или
  разметку) к инфраструктуре MVC, и не выполняете никакого
  дополнительного конфигурирования
▪ Например – все контроллеры должны реализовывать интерфейс IController
  (условие, необходимое для работы), находиться в папке Controllers иметь
  постфикс имение Controller (конвенции, позволяющие обойтись без их
  явного конфигурирования)
ASP.NET MVC – это тот же ASP.NET
▪ То есть стоит на плечах гигантов...

▪ Единая среда для Web Forms и MVC
▪ Одно и то же программное окружение
   – Один и тот же набор модулей для аутентификации, кэширования,
     хранения сессий
   – Централизованный HTTP хэндлер, отдающий все ресурсы
• Возможность работы бок о бок
   – Классические Web Forms и ASP.NET MVC могут работать внутри
     одного и того же проекта
Controllers
▪ Задачи контроллера – это принять данные от пользователя и обработать их,
  или, наоборот, подготовить данные для отправки пользователю
▪ Содержит множество (возможно, пустое )Actions
▪ Как правило – сгруппированных по смыслу
▪ Каждый Action возвращает информацию, содержащую:
  - модель (model)
  - данные для выбора представления (View)
Model
▪ Класс. Просто класс. Plain Old Class Object, он же POCO. Других особых
  требований к нему нет.
▪ С точки зрения Best Practices существует два подхода:
  - пишем для Action-ов свои классы, описывающие минимально необходимую
  сущность (public class HumanViewModel)
  - используем классы из доменной модели нашего приложения, например,
  сгенерированные Entity Framework и имеющие маппинги на базу данных
▪ (автор является строгим приверженцем первого подхода)

▪ Однако модель может быть декорирована атрибутами, описывающими еѐ и
  автоматически включающими клиентскую и серверную валидацию
▪ (хотя с тем же успехом к ней может быть создана парная мета-модель... Но это уже совсем отдельная тема)
Views
▪ Отвечают за преобразование данных (модели) в браузерочитаемую
  разметку
▪ Использование ASPX/ASCX – только потому, что мы уже умеем на них
  писать
▪ Это не полноценная страница (Page) – это шаблон. У него нет жизненного
  цикла, у него вообще жизни нет.
▪ Единственная цель остается той же – получить строку с HTML внутри
▪ Возможность подключения кастомизированных View Engine, начиная с
  первой версии
▪ Поддерживаемый Microsoft ViewEngine Razor начиная с третьей версии
  ASP.NET MVC
Cтандартный механизм View
▪ Pure HTML
▪ HTML.* helpers
▪ AJAX.* helpers
▪ URL.* helpers
▪ <%= … %> vs <%: … %> vs <% %> vs @... vs @{ … }
▪ Повторное использование кода и разметки – пользовательские контролы
Rich User Interface
▪ Легкость взаимодействия с JavaScript – разметка не меняется после
  серверной обработки
▪ jQuery в коробке, поддерживается Microsoft
▪ Легкость AJAX-взаимодействия с сервером – можно обращаться напрямую к
  Action
▪ Встроенные AJAX.* helpers (начиная с версии 3 используют jQuery, а не
  собственные библиотеки Microsoft)
▪ Обмен данными в форматах plain HTML, JSON, JavaScript
▪ Благодаря этому – повторное использование серверных контролов в
  клиентском коде без многократных перегрузок страниц
Unobtrusive JavaScript
▪ Разделение обязанностей – HTML отдельно, JavaScript отдельно
▪ HTML-5 style
  <input type=―text‖ data-valid=―true‖ value=―Привет‖/>
▪ AJAX.* и валидация данных используют этот подход,
  начиная с версии 3
▪ Значительно упрощает получение HTML через ajax-запрос
▪ Значительно упрощает кастомизацию
▪ Значительно увеличивает читаемость кода
Валидация данных
▪ Декларативное объявление атрибутов валидности
▪ Атрибуты ассоциированны с самой моделью
▪ Если модель недоступна (например, сгенерирована) – можно создать для
  неѐ класс – поставщик метаданных
▪ Единая модель валидации для клиента и сервера
▪ Начиная с MVC 3 – jquery.validation как движок клиентской валидации
▪ Декларативный HTML-5 стиль на клиенте – легкость работы с AJAX
URL mapping
▪ Сопоставляет пришедший запрос с контроллером, методом
▪ Служит одним из источником параметров Action-ов
▪ User-friendly URL
Сильно упрощенная схема генерации ответа

     User Request
                         IIS handles request   Routing Module   MVCRouteHandler
    http://getdev.net




                                                                View Engine – look
    Controller Factory       Controller            Action
                                                                     for view




   Execute View to get    Send response
        markup           back to user agent
Как в контроллеры приходят параметры?
Концепция Model Binders
•   Заполнение модели сырыми данными из формы, запроса и прочих источников
    данных, пришедших от пользователя – НЕ работа контроллера
    Это нарушило бы принцип Single Responsibility
•   Для любой модели можно определить класс, который ей конструирует,
    глобально или на уровне отдельного метода
Default Model Binder
•   ValueProvider: данные из формы, данные из строки запроса
•   Сопоставление данных со свойствами модели происходит по имени
•   Угадайте механизм .NET, который позволяет это делать
                                                           Reflection
Areas
▪ Средство для разбиения одного большого сайта на несколько почти
  независимых маленьких
▪ Каждая Area имеет свой набор контроллеров, View и (опционально) моделей
▪ Типичный пример – одна Area для обычных пользователей, другая – для
  администраторов
Action Filters
▪ Фильтр операции (action filter) — это атрибут, который позволяет
  декларативно подключать к запрошенной операции некое поведение.
▪ IActionFilter - Методы этого интерфейса вызываются до и после выполнения
  метода контроллера
▪ IAuthorizationFilter - Методы этого интерфейса вызываются до выполнения
  метода контроллера
▪ IExceptionFilter - Методы этого интерфейса вызываются всякий раз, когда при
  выполнении метода контроллера генерируется исключение
▪ IResultFilter - Методы этого интерфейса вызываются до и после обработки
  результата операции
Dependency Injection
▪ В соответствии с первоначальной задумкой, в ASP.NET MVC предусмотрено
  множество мест, в которых можно перехватывать или заменять фукнционал
  фреймворка, не используя грязных хаков
▪ Наиболее популярные заменяемые части:
  - инстанциирование контроллеров
  - View Engine
  - Model Binder
▪ Всего же мест для замены стандартных частей фреймворка в ASP.NET MVC
  4 порядка полутора десятков
Интересное чтение
▪ Pro ASP.NET MVC 3 Framework by Steven Sanderson & Adam Freeman
▪ Professional ASP.NET MVC 4 by Phil Haack and many, many others
▪ http://www.asp.net/mvc
▪ Фильтры операций в ASP.NET MVC от Дино Эспозито
Интересное видео
▪ http://www.mvcconf.com/ - онлайн-конференция, посвященная ASP.NET MVC
▪ ASP.NET MVC For Web Forms developers by Dino Esposito
Вопросы?
                 Внимательно слушаю! 


Андрей Кулешов

kaa-tula@ya.ru
    akuleshov.tula




Специально для http://GetDev.NET
Ad

More Related Content

Similar to ASP.NET, MVC, ASP.NET MVC (20)

ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
GetDev.NET
 
ASP.NET MVC: new era?
ASP.NET MVC: new era?ASP.NET MVC: new era?
ASP.NET MVC: new era?
Alexander Konduforov
 
C# Web. Занятие 05.
C# Web. Занятие 05.C# Web. Занятие 05.
C# Web. Занятие 05.
Igor Shkulipa
 
Паттерны проектирования
Паттерны проектированияПаттерны проектирования
Паттерны проектирования
ITCP Community
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
Igor Shkulipa
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложениях
Magecom Ukraine
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в Magento
Pavel Usachev
 
C# Web. Занятие 01.
C# Web. Занятие 01.C# Web. Занятие 01.
C# Web. Занятие 01.
Igor Shkulipa
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
Andrew Mayorov
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
Roman Brovko
 
Сервлеты
СервлетыСервлеты
Сервлеты
Unguryan Vitaliy
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
Anton Loginov
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéРазработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для Caché
InterSystems CEE
 
Андрей Завадский "Бессерверная архитектура"
 Андрей Завадский "Бессерверная архитектура" Андрей Завадский "Бессерверная архитектура"
Андрей Завадский "Бессерверная архитектура"
Fwdays
 
Анна Якубенко, Татьяна Лебедева - SAP ERP в качестве backend для HTML5 прилож...
Анна Якубенко, Татьяна Лебедева - SAP ERP в качестве backend для HTML5 прилож...Анна Якубенко, Татьяна Лебедева - SAP ERP в качестве backend для HTML5 прилож...
Анна Якубенко, Татьяна Лебедева - SAP ERP в качестве backend для HTML5 прилож...
Ilya Kaznacheev
 
ASP.NET MVC 4
ASP.NET MVC 4ASP.NET MVC 4
ASP.NET MVC 4
GetDev.NET
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
Igor Shkulipa
 
ВІТАЛІЙ ГОНЧАРУК «За допомогою чого пишуться серйозні веб додатки на .NET» O...
ВІТАЛІЙ ГОНЧАРУК «За допомогою чого пишуться серйозні веб додатки на .NET»  O...ВІТАЛІЙ ГОНЧАРУК «За допомогою чого пишуться серйозні веб додатки на .NET»  O...
ВІТАЛІЙ ГОНЧАРУК «За допомогою чого пишуться серйозні веб додатки на .NET» O...
WDDay
 
C# Web. Занятие 05.
C# Web. Занятие 05.C# Web. Занятие 05.
C# Web. Занятие 05.
Igor Shkulipa
 
Паттерны проектирования
Паттерны проектированияПаттерны проектирования
Паттерны проектирования
ITCP Community
 
C# Web. Занятие 09.
C# Web. Занятие 09.C# Web. Занятие 09.
C# Web. Занятие 09.
Igor Shkulipa
 
Стандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложенияхСтандарты и соглашения в сложных ООП-приложениях
Стандарты и соглашения в сложных ООП-приложениях
Magecom Ukraine
 
Шаблоны проектирования в Magento
Шаблоны проектирования в MagentoШаблоны проектирования в Magento
Шаблоны проектирования в Magento
Pavel Usachev
 
C# Web. Занятие 01.
C# Web. Занятие 01.C# Web. Занятие 01.
C# Web. Занятие 01.
Igor Shkulipa
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
Andrew Mayorov
 
09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
Roman Brovko
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
Anton Loginov
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéРазработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для Caché
InterSystems CEE
 
Андрей Завадский "Бессерверная архитектура"
 Андрей Завадский "Бессерверная архитектура" Андрей Завадский "Бессерверная архитектура"
Андрей Завадский "Бессерверная архитектура"
Fwdays
 
Анна Якубенко, Татьяна Лебедева - SAP ERP в качестве backend для HTML5 прилож...
Анна Якубенко, Татьяна Лебедева - SAP ERP в качестве backend для HTML5 прилож...Анна Якубенко, Татьяна Лебедева - SAP ERP в качестве backend для HTML5 прилож...
Анна Якубенко, Татьяна Лебедева - SAP ERP в качестве backend для HTML5 прилож...
Ilya Kaznacheev
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
Igor Shkulipa
 
ВІТАЛІЙ ГОНЧАРУК «За допомогою чого пишуться серйозні веб додатки на .NET» O...
ВІТАЛІЙ ГОНЧАРУК «За допомогою чого пишуться серйозні веб додатки на .NET»  O...ВІТАЛІЙ ГОНЧАРУК «За допомогою чого пишуться серйозні веб додатки на .NET»  O...
ВІТАЛІЙ ГОНЧАРУК «За допомогою чого пишуться серйозні веб додатки на .NET» O...
WDDay
 

More from GetDev.NET (20)

Go
GoGo
Go
GetDev.NET
 
Leap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущееLeap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущее
GetDev.NET
 
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов
GetDev.NET
 
Mind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучшеMind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучше
GetDev.NET
 
Что нового в Visual Studio 2015
Что нового в Visual Studio 2015Что нового в Visual Studio 2015
Что нового в Visual Studio 2015
GetDev.NET
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революция
GetDev.NET
 
Windows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиковWindows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиков
GetDev.NET
 
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКPhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
GetDev.NET
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
GetDev.NET
 
Что нового в Visual Studio 2013
Что нового в Visual Studio 2013Что нового в Visual Studio 2013
Что нового в Visual Studio 2013
GetDev.NET
 
AngularJS
AngularJSAngularJS
AngularJS
GetDev.NET
 
TypeScript
TypeScriptTypeScript
TypeScript
GetDev.NET
 
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
GetDev.NET
 
Lego Mindstorms
Lego MindstormsLego Mindstorms
Lego Mindstorms
GetDev.NET
 
Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8
GetDev.NET
 
Async Javascript
Async JavascriptAsync Javascript
Async Javascript
GetDev.NET
 
XAML - язык разметки приложений
XAML - язык разметки приложенийXAML - язык разметки приложений
XAML - язык разметки приложений
GetDev.NET
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
GetDev.NET
 
JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработки
GetDev.NET
 
Roslyn - компилятор как сервис
Roslyn - компилятор как сервисRoslyn - компилятор как сервис
Roslyn - компилятор как сервис
GetDev.NET
 
Leap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущееLeap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущее
GetDev.NET
 
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов
GetDev.NET
 
Mind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучшеMind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучше
GetDev.NET
 
Что нового в Visual Studio 2015
Что нового в Visual Studio 2015Что нового в Visual Studio 2015
Что нового в Visual Studio 2015
GetDev.NET
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революция
GetDev.NET
 
Windows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиковWindows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиков
GetDev.NET
 
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКPhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
GetDev.NET
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
GetDev.NET
 
Что нового в Visual Studio 2013
Что нового в Visual Studio 2013Что нового в Visual Studio 2013
Что нового в Visual Studio 2013
GetDev.NET
 
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
GetDev.NET
 
Lego Mindstorms
Lego MindstormsLego Mindstorms
Lego Mindstorms
GetDev.NET
 
Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8
GetDev.NET
 
Async Javascript
Async JavascriptAsync Javascript
Async Javascript
GetDev.NET
 
XAML - язык разметки приложений
XAML - язык разметки приложенийXAML - язык разметки приложений
XAML - язык разметки приложений
GetDev.NET
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
GetDev.NET
 
JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработки
GetDev.NET
 
Roslyn - компилятор как сервис
Roslyn - компилятор как сервисRoslyn - компилятор как сервис
Roslyn - компилятор как сервис
GetDev.NET
 
Ad

ASP.NET, MVC, ASP.NET MVC

  • 1. Андрей Кулешов ASP.NET, MVC, ASP.NET MVC История, паттерны, реализация
  • 2. История ▪ В 1991 появляется первый стандарт языка разметки HTML – Hyper Text Markup Language ▪ В следующее десятилетие наблюдается взрывной рост количества веб- серверов (как программного обеспечения, так и машин, обслуживающих запросы), веб-браузеров, веб-стандартов ▪ От серверов, отдающих статическое содержимое (файлы на жестком диске) – к динамическому содержимому (когда возвращаемый результат был результатом работы программы) ▪ Январь 2002 – релиз ASP.NET Web Forms (вместе с .NET как таковым)
  • 3. Почему перестало хватать Web Forms? ▪ ASP.NET – хорошая программная платформа, созданная десятилетие назад • Одно из декларированных преимуществ – не нужно учить HTML – мы кидаем на страницу контролы (привет, разработчики Visual Basic) и всѐ автомагически происходит на сервере • Потому что в далекие времена ничего хорошего на клиенте происходить не могло • Высокая сложность клиентского кода – у каждого браузера свой диалект JavaScript (он же LiveScript, он же JScript, и всѐ это станет стандартом ECMAScript), своя DOM, и нет никаких распространенных фреймворков, позволяющих абстрагироваться от этих различий • Обмен данными между клиентом и сервером идѐт строго по схеме GET – POST (и разработчикам Web Forms даже не надо знать этих слов)
  • 4. Что случилось? ▪ AJAX ▪ Стандартизация ▪ JavaScript фреймворки (jQuery, Yahoo) ▪ Расширение возможностей браузеров ▪ Распространение unit-тестирования
  • 5. Люди, желавшие странного... ▪ Лучший контроль над генерируемой HTML-разметкой ▪ Лучшие возможности для создание скриптов на клиенте ▪ Больше возможностей для юнит-тестирования логики
  • 6. Демо MVC для ASP.NET своими руками
  • 7. Единая точка входа запросов ▪ Все запросы перенаправляются на центральный IHttpHandler ▪ Если по запрошенному пути существуют физический файл на диске, то сервер возвращает этот файл ▪ Иначе – запрос обрабатывается согласно правилам роутинга
  • 8. Сферический MVC в ваакуме ▪ Model-view-controller (MVC, «Модель-представление-поведение», «Модель- представление-контроллер») — архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты. • Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя своѐ состояние. • Представление (View). Отвечает за отображение информации (пользовательский интерфейс). • Контроллер(Controller). Интерпретирует данные, введѐнные пользователем, и информирует модель и представление о необходимости соответствующей реакции. - модель независима от визуального представления - для одной и той же модели можно создавать различные представления
  • 9. Явление ASP.NET MVC народу ▪ Прототип придуман в феврале 2007 года Скоттом Гуфри, на борту самолета, на котором тот летел на конференцию на восточное побережье США ▪ Впервые показан в октябре 2007 года, где вызвал интерес и желание продолжать ▪ ASP.NET MVC CTP – декабрь 2007 ▪ Первый релиз в марте 2009 ▪ Последний стабильный релиз – MVC 4 – август 2012 г.
  • 11. Separation of Concerns Разделение ответственности Предназначено для того, чтобы сделать код более
  • 12. Configuration over Convention ▪ Есть ряд простых правил (именования файлов и классов, размещения их внутри папок), следуя которым, вы просто подключаете ваш код (или разметку) к инфраструктуре MVC, и не выполняете никакого дополнительного конфигурирования ▪ Например – все контроллеры должны реализовывать интерфейс IController (условие, необходимое для работы), находиться в папке Controllers иметь постфикс имение Controller (конвенции, позволяющие обойтись без их явного конфигурирования)
  • 13. ASP.NET MVC – это тот же ASP.NET ▪ То есть стоит на плечах гигантов... ▪ Единая среда для Web Forms и MVC ▪ Одно и то же программное окружение – Один и тот же набор модулей для аутентификации, кэширования, хранения сессий – Централизованный HTTP хэндлер, отдающий все ресурсы • Возможность работы бок о бок – Классические Web Forms и ASP.NET MVC могут работать внутри одного и того же проекта
  • 14. Controllers ▪ Задачи контроллера – это принять данные от пользователя и обработать их, или, наоборот, подготовить данные для отправки пользователю ▪ Содержит множество (возможно, пустое )Actions ▪ Как правило – сгруппированных по смыслу ▪ Каждый Action возвращает информацию, содержащую: - модель (model) - данные для выбора представления (View)
  • 15. Model ▪ Класс. Просто класс. Plain Old Class Object, он же POCO. Других особых требований к нему нет. ▪ С точки зрения Best Practices существует два подхода: - пишем для Action-ов свои классы, описывающие минимально необходимую сущность (public class HumanViewModel) - используем классы из доменной модели нашего приложения, например, сгенерированные Entity Framework и имеющие маппинги на базу данных ▪ (автор является строгим приверженцем первого подхода) ▪ Однако модель может быть декорирована атрибутами, описывающими еѐ и автоматически включающими клиентскую и серверную валидацию ▪ (хотя с тем же успехом к ней может быть создана парная мета-модель... Но это уже совсем отдельная тема)
  • 16. Views ▪ Отвечают за преобразование данных (модели) в браузерочитаемую разметку ▪ Использование ASPX/ASCX – только потому, что мы уже умеем на них писать ▪ Это не полноценная страница (Page) – это шаблон. У него нет жизненного цикла, у него вообще жизни нет. ▪ Единственная цель остается той же – получить строку с HTML внутри ▪ Возможность подключения кастомизированных View Engine, начиная с первой версии ▪ Поддерживаемый Microsoft ViewEngine Razor начиная с третьей версии ASP.NET MVC
  • 17. Cтандартный механизм View ▪ Pure HTML ▪ HTML.* helpers ▪ AJAX.* helpers ▪ URL.* helpers ▪ <%= … %> vs <%: … %> vs <% %> vs @... vs @{ … } ▪ Повторное использование кода и разметки – пользовательские контролы
  • 18. Rich User Interface ▪ Легкость взаимодействия с JavaScript – разметка не меняется после серверной обработки ▪ jQuery в коробке, поддерживается Microsoft ▪ Легкость AJAX-взаимодействия с сервером – можно обращаться напрямую к Action ▪ Встроенные AJAX.* helpers (начиная с версии 3 используют jQuery, а не собственные библиотеки Microsoft) ▪ Обмен данными в форматах plain HTML, JSON, JavaScript ▪ Благодаря этому – повторное использование серверных контролов в клиентском коде без многократных перегрузок страниц
  • 19. Unobtrusive JavaScript ▪ Разделение обязанностей – HTML отдельно, JavaScript отдельно ▪ HTML-5 style <input type=―text‖ data-valid=―true‖ value=―Привет‖/> ▪ AJAX.* и валидация данных используют этот подход, начиная с версии 3 ▪ Значительно упрощает получение HTML через ajax-запрос ▪ Значительно упрощает кастомизацию ▪ Значительно увеличивает читаемость кода
  • 20. Валидация данных ▪ Декларативное объявление атрибутов валидности ▪ Атрибуты ассоциированны с самой моделью ▪ Если модель недоступна (например, сгенерирована) – можно создать для неѐ класс – поставщик метаданных ▪ Единая модель валидации для клиента и сервера ▪ Начиная с MVC 3 – jquery.validation как движок клиентской валидации ▪ Декларативный HTML-5 стиль на клиенте – легкость работы с AJAX
  • 21. URL mapping ▪ Сопоставляет пришедший запрос с контроллером, методом ▪ Служит одним из источником параметров Action-ов ▪ User-friendly URL
  • 22. Сильно упрощенная схема генерации ответа User Request IIS handles request Routing Module MVCRouteHandler http://getdev.net View Engine – look Controller Factory Controller Action for view Execute View to get Send response markup back to user agent
  • 23. Как в контроллеры приходят параметры? Концепция Model Binders • Заполнение модели сырыми данными из формы, запроса и прочих источников данных, пришедших от пользователя – НЕ работа контроллера Это нарушило бы принцип Single Responsibility • Для любой модели можно определить класс, который ей конструирует, глобально или на уровне отдельного метода Default Model Binder • ValueProvider: данные из формы, данные из строки запроса • Сопоставление данных со свойствами модели происходит по имени • Угадайте механизм .NET, который позволяет это делать Reflection
  • 24. Areas ▪ Средство для разбиения одного большого сайта на несколько почти независимых маленьких ▪ Каждая Area имеет свой набор контроллеров, View и (опционально) моделей ▪ Типичный пример – одна Area для обычных пользователей, другая – для администраторов
  • 25. Action Filters ▪ Фильтр операции (action filter) — это атрибут, который позволяет декларативно подключать к запрошенной операции некое поведение. ▪ IActionFilter - Методы этого интерфейса вызываются до и после выполнения метода контроллера ▪ IAuthorizationFilter - Методы этого интерфейса вызываются до выполнения метода контроллера ▪ IExceptionFilter - Методы этого интерфейса вызываются всякий раз, когда при выполнении метода контроллера генерируется исключение ▪ IResultFilter - Методы этого интерфейса вызываются до и после обработки результата операции
  • 26. Dependency Injection ▪ В соответствии с первоначальной задумкой, в ASP.NET MVC предусмотрено множество мест, в которых можно перехватывать или заменять фукнционал фреймворка, не используя грязных хаков ▪ Наиболее популярные заменяемые части: - инстанциирование контроллеров - View Engine - Model Binder ▪ Всего же мест для замены стандартных частей фреймворка в ASP.NET MVC 4 порядка полутора десятков
  • 27. Интересное чтение ▪ Pro ASP.NET MVC 3 Framework by Steven Sanderson & Adam Freeman ▪ Professional ASP.NET MVC 4 by Phil Haack and many, many others ▪ http://www.asp.net/mvc ▪ Фильтры операций в ASP.NET MVC от Дино Эспозито
  • 28. Интересное видео ▪ http://www.mvcconf.com/ - онлайн-конференция, посвященная ASP.NET MVC ▪ ASP.NET MVC For Web Forms developers by Dino Esposito
  • 29. Вопросы? Внимательно слушаю!  Андрей Кулешов [email protected] akuleshov.tula Специально для http://GetDev.NET