Опыт работы с фреймворком asp.net mvc
Post on 14-Dec-2014
857 Views
Preview:
DESCRIPTION
TRANSCRIPT
Опыт работы с 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 и другие)
Стек технологий
Зачем?
• Поделиться опытом работы с ASP.NET MVC• ~ 15 проектов в студии• нужно их поддерживать• избавиться от дублирования кода
• Любым инструментом нужно уметь правильно пользоваться!
За что я люблю ASP.NET MVC?
• Очень гибкий и расширяемый фреймворк• Соблюдает принципы ООП (SOLID)• Полное управление Html (в отличие от WebForms)• Хорошая документация• Очень много примеров в интернете (stackoverflow.com)• C#• Качественные и понятные исходники• …
Недостатки ASP.NET MVC
• Достаточно высокий порог вхождения• Необходимо понимать принципы ООП• Необходимо понимать философию фреймворка• …
Философия MVC
• Слишком грубо• В ASP.NET MVC 4 уже не работает
Особенности сайтов по сравнению с веб-приложениями
• Много контента• Мало форм• Богатый дизайн
Используйте IoC-контейнеры!До ASP.NET MVC 3:
Начиная с ASP.NET MVC 3:
Вызов контейнера:
TempDataASP.NET MVC 1: данные сохраняются до следующего запроса
ASP.NET MVC 2: данные сохраняются до прочтения или истечения сессии
ASP.NET MVC 3+: данные сохраняются от запроса к запросу, если не вызван метод Keep(string key). Если вызван, то жизнь продливается на запрос
Абстракция зависимостейАбстракции, которые уже есть в MVC:• HttpContextBase• HttpSessionStateBase• HttpRequestBase• HttpResponseBase
Можно вынести:• IUrlHelperProvider• IHttpContextProvider• ICacheManager• …
RoutingРоут по умолчанию - /{controller}/{action}/{id}Примеры:/Product/Index/Product/Item/5
Недостатки:• Страница /Product/Index доступна и по адресу
/Product – плохо для SEO и неоднозначность• Наружу торчит все внутреннее устройство
сайта/приложения• Проблемы при рефакторинге и разбиении
контроллеров на более маленькие• REST• Регистр (?)
Routing в студии• Удаляем роут по умолчанию• Не используем для генерации именованные роуты• Строго-типизированная регистрация роутов:
Плюсы:• Рефакторинг• Find Usages
• Строго-типизированная генерация роутов
Routing. Обратная сторонаУвеличивается время генерирования урлов на странице… особенно, когда их 20–30 и больше
Выход: «умное» кэширование роутов – ключ на основе имен контроллеров и экшенов
kontur.ru – 250 роутовbuhonline.ru – 275 роутов
Rewriter• Удаление/добавление завершающего слэша• Редиректы со старых адресов• Переписывание урлов
/theme/ver-123456789/….js/theme/ver-123456789/….css/theme/ver-123456789/…
Статические файлы:/theme/….js/theme/….css/theme/…
«Тонкие» контроллерыViewModelBuilder’ы для построения вью-модели
«Тонкие» контроллерыFormHandler’ы для обработки формы
ViewModel• ViewModel != DomainModel• Всегда строго-типизированная модель• ViewData и ViewBag почти всегда зло• ViewModel может быть очень сложной и состоять из
подмоделей• ViewModel формируется так, чтобы представление не
содержало лишней логики
Идея I*FormHolder
Идея I*FormHolderПредставление:
Идея I*FormHolder
Плюсы:• Более уникальные идентификаторы html-элементов
на странице• Автоматический рефакторинг• Поддержка• Особенно помогает в сложных формах
Валидация данныхValidationAttribute:• InnKppAttribute• SnilsAtrribute• RequiredWhenOtherTrueAttribute• RequiredWhenOtherEqualValueAttribute• и другие
Клиентская валидация (unobtrusive)
Реализация интерфейса IClientValidatableПлагин jquery.validateНаписание адаптераНаписание метода валидации
Клиентская валидация (пример)
Клиентская валидация (пример)
Привязка данных
• Очень мощный механизм• Привязка сложных форм• Привязка из разных источников• Реализация кастомных ModelBinder’ов
(TrimModelBinder, IntModelBinder)• Нужно использовать!
Привязка данных (пример)Постановка задачи:• Пользователь вводит номер телефона• Нужно сохранить его в формате (89222222222)• Если реально привести номер к такому формату – ОК• Если нет – ошибка валидации
• +7 922-222-22-22• 8 922 222 22 22• 922 222 22 22• (922) 222-22-22
Пример:
89222222222
Привязка данных. Решение 1
Привязка данных. Решение 2Объявляем класс
Привязка данных. Решение 2Пишем для него ModelBinder
Привязка данных. Решение 2Используем
Преимущества:• Нет дублирования• Простота использования
RouteConstraints• Отсечение неподходящего роута• «Первичная» валидация данных• Кастомные RouteConstraints:• GuidConstraint• *StateRouteConstraint• …
RouteConstraints (пример)
kontur.ru/diadoc/*kontur.ru/focus/*
“{productName}”“{productName}/news”“{productName}/order”
ActionMethodSelector• Дополнительная логика по выбору экшна• Упрощение логики в самом экшене• Кастомные селекторы:• AcceptParameterAttribute• …
ActionMethodSelector (пример)kontur.ru/{product}/order – разные способы покупок
ActionMethodSelector (пример)kontur.ru/{product}/order – разные способы покупок
Фильтры действий
• Огромные возможности по расширению функционала сайта или приложения
• Возможность изменения стандартного выполнения запроса (filterContext.Result)
• Вынесение общего кода• Кастомные фильтры• CustomContentTypeAttribute• PromoCodeFilterAttribute
Логгирование ошибок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
Обработка ошибокHandleErrorAttribute
Ошибки могут возникнуть не только внутри экшнаGlobal.asax.cs: Application_OnError()
Вынесение общего кода - IHttpModule:HandleErrorHttpModulepublic void Init(HttpApplication context){
context.Error += ContextError}
Другие точки расширения MVC• AuthorizationFilter• ActionResult• ResultFilter• ViewEngine• HtmlHelpers• …
Ресурсы
• http://asp.net/mvc• Pro ASP.NET MVC 3 Framework с примерами на c#
для профессионалов (Адам Фримен, Стивен Сандерсон)
• ASP.NET MVC in Action (Jeffrey Palermo, Ben Scheirman, and Jimmy Bogard)
• …
Романовский Евгенийskype: e.infomantwitter: @einfomanemail: infoman@skbkontur.ru
top related