Видео с доклада: http://getdev.net/Event/asp-net-mvc-4
Доклад об 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-разметкой
▪ Лучшие возможности для создание скриптов на клиенте
▪ Больше возможностей для юнит-тестирования логики
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 г.
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 от Дино Эспозито