Опыт работы с фреймворком asp.net mvc

42
Опыт работы с ASP.NET MVC Романовский Евгений, веб-студия СКБ Контур

Upload: -

Post on 14-Dec-2014

857 views

Category:

Technology


0 download

DESCRIPTION

Презентация с Открытого семинара . Ведущий — Евгений Романовский, инженер-программист веб-студии СКБ Контур. Видео с выступления доступно тут http://it-eburg.com/text/article/opyt_raboty_s_freimvorkom_aspnet_mvc/

TRANSCRIPT

Page 1: Опыт работы с фреймворком ASP.NET MVC

Опыт работы с ASP.NET MVC

Романовский Евгений,веб-студия СКБ Контур

Page 2: Опыт работы с фреймворком ASP.NET MVC

Проекты веб-студии:

• 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

Стек технологий

Page 4: Опыт работы с фреймворком ASP.NET MVC

Зачем?

• Поделиться опытом работы с ASP.NET MVC• ~ 15 проектов в студии• нужно их поддерживать• избавиться от дублирования кода

• Любым инструментом нужно уметь правильно пользоваться!

Page 5: Опыт работы с фреймворком ASP.NET MVC

За что я люблю ASP.NET MVC?

• Очень гибкий и расширяемый фреймворк• Соблюдает принципы ООП (SOLID)• Полное управление Html (в отличие от WebForms)• Хорошая документация• Очень много примеров в интернете (stackoverflow.com)• C#• Качественные и понятные исходники• …

Page 6: Опыт работы с фреймворком ASP.NET MVC

Недостатки ASP.NET MVC

• Достаточно высокий порог вхождения• Необходимо понимать принципы ООП• Необходимо понимать философию фреймворка• …

Page 7: Опыт работы с фреймворком ASP.NET MVC

Философия MVC

• Слишком грубо• В ASP.NET MVC 4 уже не работает

Page 8: Опыт работы с фреймворком ASP.NET MVC

Особенности сайтов по сравнению с веб-приложениями

• Много контента• Мало форм• Богатый дизайн

Page 9: Опыт работы с фреймворком ASP.NET MVC

Используйте IoC-контейнеры!До ASP.NET MVC 3:

Начиная с ASP.NET MVC 3:

Вызов контейнера:

Page 10: Опыт работы с фреймворком ASP.NET MVC

TempDataASP.NET MVC 1: данные сохраняются до следующего запроса

ASP.NET MVC 2: данные сохраняются до прочтения или истечения сессии

ASP.NET MVC 3+: данные сохраняются от запроса к запросу, если не вызван метод Keep(string key). Если вызван, то жизнь продливается на запрос

Page 11: Опыт работы с фреймворком ASP.NET MVC

Абстракция зависимостейАбстракции, которые уже есть в MVC:• HttpContextBase• HttpSessionStateBase• HttpRequestBase• HttpResponseBase

Можно вынести:• IUrlHelperProvider• IHttpContextProvider• ICacheManager• …

Page 12: Опыт работы с фреймворком ASP.NET MVC

RoutingРоут по умолчанию - /{controller}/{action}/{id}Примеры:/Product/Index/Product/Item/5

Недостатки:• Страница /Product/Index доступна и по адресу

/Product – плохо для SEO и неоднозначность• Наружу торчит все внутреннее устройство

сайта/приложения• Проблемы при рефакторинге и разбиении

контроллеров на более маленькие• REST• Регистр (?)

Page 13: Опыт работы с фреймворком ASP.NET MVC

Routing в студии• Удаляем роут по умолчанию• Не используем для генерации именованные роуты• Строго-типизированная регистрация роутов:

Плюсы:• Рефакторинг• Find Usages

• Строго-типизированная генерация роутов

Page 14: Опыт работы с фреймворком ASP.NET MVC

Routing. Обратная сторонаУвеличивается время генерирования урлов на странице… особенно, когда их 20–30 и больше

Выход: «умное» кэширование роутов – ключ на основе имен контроллеров и экшенов

kontur.ru – 250 роутовbuhonline.ru – 275 роутов

Page 15: Опыт работы с фреймворком ASP.NET MVC

Rewriter• Удаление/добавление завершающего слэша• Редиректы со старых адресов• Переписывание урлов

/theme/ver-123456789/….js/theme/ver-123456789/….css/theme/ver-123456789/…

Статические файлы:/theme/….js/theme/….css/theme/…

Page 16: Опыт работы с фреймворком ASP.NET MVC

«Тонкие» контроллерыViewModelBuilder’ы для построения вью-модели

Page 17: Опыт работы с фреймворком ASP.NET MVC

«Тонкие» контроллерыFormHandler’ы для обработки формы

Page 18: Опыт работы с фреймворком ASP.NET MVC

ViewModel• ViewModel != DomainModel• Всегда строго-типизированная модель• ViewData и ViewBag почти всегда зло• ViewModel может быть очень сложной и состоять из

подмоделей• ViewModel формируется так, чтобы представление не

содержало лишней логики

Page 19: Опыт работы с фреймворком ASP.NET MVC

Идея I*FormHolder

Page 20: Опыт работы с фреймворком ASP.NET MVC

Идея I*FormHolderПредставление:

Page 21: Опыт работы с фреймворком ASP.NET MVC

Идея I*FormHolder

Плюсы:• Более уникальные идентификаторы html-элементов

на странице• Автоматический рефакторинг• Поддержка• Особенно помогает в сложных формах

Page 22: Опыт работы с фреймворком ASP.NET MVC

Валидация данныхValidationAttribute:• InnKppAttribute• SnilsAtrribute• RequiredWhenOtherTrueAttribute• RequiredWhenOtherEqualValueAttribute• и другие

Page 23: Опыт работы с фреймворком ASP.NET MVC

Клиентская валидация (unobtrusive)

Реализация интерфейса IClientValidatableПлагин jquery.validateНаписание адаптераНаписание метода валидации

Page 24: Опыт работы с фреймворком ASP.NET MVC

Клиентская валидация (пример)

Page 25: Опыт работы с фреймворком ASP.NET MVC

Клиентская валидация (пример)

Page 26: Опыт работы с фреймворком ASP.NET MVC

Привязка данных

• Очень мощный механизм• Привязка сложных форм• Привязка из разных источников• Реализация кастомных ModelBinder’ов

(TrimModelBinder, IntModelBinder)• Нужно использовать!

Page 27: Опыт работы с фреймворком ASP.NET MVC

Привязка данных (пример)Постановка задачи:• Пользователь вводит номер телефона• Нужно сохранить его в формате (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

Привязка данных. Решение 1

Page 29: Опыт работы с фреймворком ASP.NET MVC

Привязка данных. Решение 2Объявляем класс

Page 30: Опыт работы с фреймворком ASP.NET MVC

Привязка данных. Решение 2Пишем для него ModelBinder

Page 31: Опыт работы с фреймворком ASP.NET MVC

Привязка данных. Решение 2Используем

Преимущества:• Нет дублирования• Простота использования

Page 32: Опыт работы с фреймворком ASP.NET MVC

RouteConstraints• Отсечение неподходящего роута• «Первичная» валидация данных• Кастомные RouteConstraints:• GuidConstraint• *StateRouteConstraint• …

Page 33: Опыт работы с фреймворком ASP.NET MVC

RouteConstraints (пример)

kontur.ru/diadoc/*kontur.ru/focus/*

“{productName}”“{productName}/news”“{productName}/order”

Page 34: Опыт работы с фреймворком ASP.NET MVC

ActionMethodSelector• Дополнительная логика по выбору экшна• Упрощение логики в самом экшене• Кастомные селекторы:• AcceptParameterAttribute• …

Page 35: Опыт работы с фреймворком ASP.NET MVC

ActionMethodSelector (пример)kontur.ru/{product}/order – разные способы покупок

Page 36: Опыт работы с фреймворком ASP.NET MVC

ActionMethodSelector (пример)kontur.ru/{product}/order – разные способы покупок

Page 37: Опыт работы с фреймворком ASP.NET MVC

Фильтры действий

• Огромные возможности по расширению функционала сайта или приложения

• Возможность изменения стандартного выполнения запроса (filterContext.Result)

• Вынесение общего кода• Кастомные фильтры• CustomContentTypeAttribute• PromoCodeFilterAttribute

Page 38: Опыт работы с фреймворком ASP.NET MVC

Логгирование ошибок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

Обработка ошибокHandleErrorAttribute

Ошибки могут возникнуть не только внутри экшнаGlobal.asax.cs: Application_OnError()

Вынесение общего кода - IHttpModule:HandleErrorHttpModulepublic void Init(HttpApplication context){

context.Error += ContextError}

Page 40: Опыт работы с фреймворком ASP.NET MVC

Другие точки расширения MVC• AuthorizationFilter• ActionResult• ResultFilter• ViewEngine• HtmlHelpers• …

Page 41: Опыт работы с фреймворком ASP.NET MVC

Ресурсы

• 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

Романовский Евгенийskype: e.infomantwitter: @einfomanemail: [email protected]