Опыт работы с фреймворком asp.net mvc
DESCRIPTION
Презентация с Открытого семинара . Ведущий — Евгений Романовский, инженер-программист веб-студии СКБ Контур. Видео с выступления доступно тут http://it-eburg.com/text/article/opyt_raboty_s_freimvorkom_aspnet_mvc/TRANSCRIPT
![Page 1: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/1.jpg)
Опыт работы с ASP.NET MVC
Романовский Евгений,веб-студия СКБ Контур
![Page 2: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/2.jpg)
Проекты веб-студии:
• http://kontur.ru – официальный сайт компании• http://www.buhonline.ru – портал для бухгалтеров• http://www.uc-skbkontur.ru – сайт Учебного центра
СКБ Контур • промо-сайты продуктов Контура (
http://www.b-kontur.ru, http://www.diadoc.ru, http://www.kontur-pf.ru, http://www.kontur-normativ.ru и другие)
![Page 3: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/3.jpg)
Стек технологий
![Page 4: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/4.jpg)
Зачем?
• Поделиться опытом работы с ASP.NET MVC• ~ 15 проектов в студии• нужно их поддерживать• избавиться от дублирования кода
• Любым инструментом нужно уметь правильно пользоваться!
![Page 5: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/5.jpg)
За что я люблю ASP.NET MVC?
• Очень гибкий и расширяемый фреймворк• Соблюдает принципы ООП (SOLID)• Полное управление Html (в отличие от WebForms)• Хорошая документация• Очень много примеров в интернете (stackoverflow.com)• C#• Качественные и понятные исходники• …
![Page 6: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/6.jpg)
Недостатки ASP.NET MVC
• Достаточно высокий порог вхождения• Необходимо понимать принципы ООП• Необходимо понимать философию фреймворка• …
![Page 7: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/7.jpg)
Философия MVC
• Слишком грубо• В ASP.NET MVC 4 уже не работает
![Page 8: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/8.jpg)
Особенности сайтов по сравнению с веб-приложениями
• Много контента• Мало форм• Богатый дизайн
![Page 9: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/9.jpg)
Используйте IoC-контейнеры!До ASP.NET MVC 3:
Начиная с ASP.NET MVC 3:
Вызов контейнера:
![Page 10: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/10.jpg)
TempDataASP.NET MVC 1: данные сохраняются до следующего запроса
ASP.NET MVC 2: данные сохраняются до прочтения или истечения сессии
ASP.NET MVC 3+: данные сохраняются от запроса к запросу, если не вызван метод Keep(string key). Если вызван, то жизнь продливается на запрос
![Page 11: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/11.jpg)
Абстракция зависимостейАбстракции, которые уже есть в MVC:• HttpContextBase• HttpSessionStateBase• HttpRequestBase• HttpResponseBase
Можно вынести:• IUrlHelperProvider• IHttpContextProvider• ICacheManager• …
![Page 12: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/12.jpg)
RoutingРоут по умолчанию - /{controller}/{action}/{id}Примеры:/Product/Index/Product/Item/5
Недостатки:• Страница /Product/Index доступна и по адресу
/Product – плохо для SEO и неоднозначность• Наружу торчит все внутреннее устройство
сайта/приложения• Проблемы при рефакторинге и разбиении
контроллеров на более маленькие• REST• Регистр (?)
![Page 13: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/13.jpg)
Routing в студии• Удаляем роут по умолчанию• Не используем для генерации именованные роуты• Строго-типизированная регистрация роутов:
Плюсы:• Рефакторинг• Find Usages
• Строго-типизированная генерация роутов
![Page 14: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/14.jpg)
Routing. Обратная сторонаУвеличивается время генерирования урлов на странице… особенно, когда их 20–30 и больше
Выход: «умное» кэширование роутов – ключ на основе имен контроллеров и экшенов
kontur.ru – 250 роутовbuhonline.ru – 275 роутов
![Page 15: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/15.jpg)
Rewriter• Удаление/добавление завершающего слэша• Редиректы со старых адресов• Переписывание урлов
/theme/ver-123456789/….js/theme/ver-123456789/….css/theme/ver-123456789/…
Статические файлы:/theme/….js/theme/….css/theme/…
![Page 16: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/16.jpg)
«Тонкие» контроллерыViewModelBuilder’ы для построения вью-модели
![Page 17: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/17.jpg)
«Тонкие» контроллерыFormHandler’ы для обработки формы
![Page 18: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/18.jpg)
ViewModel• ViewModel != DomainModel• Всегда строго-типизированная модель• ViewData и ViewBag почти всегда зло• ViewModel может быть очень сложной и состоять из
подмоделей• ViewModel формируется так, чтобы представление не
содержало лишней логики
![Page 19: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/19.jpg)
Идея I*FormHolder
![Page 20: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/20.jpg)
Идея I*FormHolderПредставление:
![Page 21: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/21.jpg)
Идея I*FormHolder
Плюсы:• Более уникальные идентификаторы html-элементов
на странице• Автоматический рефакторинг• Поддержка• Особенно помогает в сложных формах
![Page 22: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/22.jpg)
Валидация данныхValidationAttribute:• InnKppAttribute• SnilsAtrribute• RequiredWhenOtherTrueAttribute• RequiredWhenOtherEqualValueAttribute• и другие
![Page 23: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/23.jpg)
Клиентская валидация (unobtrusive)
Реализация интерфейса IClientValidatableПлагин jquery.validateНаписание адаптераНаписание метода валидации
![Page 24: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/24.jpg)
Клиентская валидация (пример)
![Page 25: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/25.jpg)
Клиентская валидация (пример)
![Page 26: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/26.jpg)
Привязка данных
• Очень мощный механизм• Привязка сложных форм• Привязка из разных источников• Реализация кастомных ModelBinder’ов
(TrimModelBinder, IntModelBinder)• Нужно использовать!
![Page 27: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/27.jpg)
Привязка данных (пример)Постановка задачи:• Пользователь вводит номер телефона• Нужно сохранить его в формате (89222222222)• Если реально привести номер к такому формату – ОК• Если нет – ошибка валидации
• +7 922-222-22-22• 8 922 222 22 22• 922 222 22 22• (922) 222-22-22
Пример:
89222222222
![Page 28: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/28.jpg)
Привязка данных. Решение 1
![Page 29: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/29.jpg)
Привязка данных. Решение 2Объявляем класс
![Page 30: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/30.jpg)
Привязка данных. Решение 2Пишем для него ModelBinder
![Page 31: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/31.jpg)
Привязка данных. Решение 2Используем
Преимущества:• Нет дублирования• Простота использования
![Page 32: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/32.jpg)
RouteConstraints• Отсечение неподходящего роута• «Первичная» валидация данных• Кастомные RouteConstraints:• GuidConstraint• *StateRouteConstraint• …
![Page 33: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/33.jpg)
RouteConstraints (пример)
kontur.ru/diadoc/*kontur.ru/focus/*
“{productName}”“{productName}/news”“{productName}/order”
![Page 34: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/34.jpg)
ActionMethodSelector• Дополнительная логика по выбору экшна• Упрощение логики в самом экшене• Кастомные селекторы:• AcceptParameterAttribute• …
![Page 35: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/35.jpg)
ActionMethodSelector (пример)kontur.ru/{product}/order – разные способы покупок
![Page 36: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/36.jpg)
ActionMethodSelector (пример)kontur.ru/{product}/order – разные способы покупок
![Page 37: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/37.jpg)
Фильтры действий
• Огромные возможности по расширению функционала сайта или приложения
• Возможность изменения стандартного выполнения запроса (filterContext.Result)
• Вынесение общего кода• Кастомные фильтры• CustomContentTypeAttribute• PromoCodeFilterAttribute
![Page 38: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/38.jpg)
Логгирование ошибок2013-06-19 08:09:35,498 [vm-www2] ERROR Front [(null)] - Exception.Message: ArgumentOutOfRangeException > Specified argument was out of the range of valid values.Parameter name: countException.StackTrace: at System.Linq.Enumerable.Range(Int32 start, Int32 count) at SquishIt.Framework.CSS.CSSPathRewriter.RewriteCssPaths(String outputPath, String sourcePath, String css, ICSSAssetsFileHasher cssAssetsFileHasher, Boolean asImport)Request.Url: http://kontur.ru/?promocode=1510Request.RawUrl: /?promocode=1510Request.Cookies:
location_region = 42__utma = 233280260.1389301656.1355380750.1371534829.1371612669.18__utmz = 233280260.1355380750.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)location_city = 5637promocode = 1510messageNotified = 1sid = 41579308promocode = 1510
Request.Headers: Accept = */*Accept-Encoding = identityAccept-Language = ruHost = kontur.ruUser-Agent = Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR
3.5.30729; InfoPath.1)Request.HttpMethod: GETRequest.IsAjaxRequest: FalseRequest.IsAuthenticated: FalseRequest.UserHostAddress: 95.181.58.94Request.UserHostName: 95.181.58.94HttpContext.User.Identity: ExceptionContext.RouteData: System.Web.Routing.RouteDataDateTime: 19.06.2013 8:09:35
![Page 39: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/39.jpg)
Обработка ошибокHandleErrorAttribute
Ошибки могут возникнуть не только внутри экшнаGlobal.asax.cs: Application_OnError()
Вынесение общего кода - IHttpModule:HandleErrorHttpModulepublic void Init(HttpApplication context){
context.Error += ContextError}
![Page 40: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/40.jpg)
Другие точки расширения MVC• AuthorizationFilter• ActionResult• ResultFilter• ViewEngine• HtmlHelpers• …
![Page 41: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/41.jpg)
Ресурсы
• http://asp.net/mvc• Pro ASP.NET MVC 3 Framework с примерами на c#
для профессионалов (Адам Фримен, Стивен Сандерсон)
• ASP.NET MVC in Action (Jeffrey Palermo, Ben Scheirman, and Jimmy Bogard)
• …
![Page 42: Опыт работы с фреймворком ASP.NET MVC](https://reader037.vdocuments.mx/reader037/viewer/2022102814/548ced53b4795996668b46db/html5/thumbnails/42.jpg)
Романовский Евгенийskype: e.infomantwitter: @einfomanemail: [email protected]