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

Post on 14-Dec-2014

857 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

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