SlideShare a Scribd company logo
Опыт работы с 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:
Вызов контейнера:
TempData
ASP.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: count
Exception.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=1510
Request.RawUrl: /?promocode=1510
Request.Cookies:
location_region = 42
__utma = 233280260.1389301656.1355380750.1371534829.1371612669.18
__utmz = 233280260.1355380750.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
location_city = 5637
promocode = 1510
messageNotified = 1
sid = 41579308
promocode = 1510
Request.Headers:
Accept = */*
Accept-Encoding = identity
Accept-Language = ru
Host = kontur.ru
User-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: GET
Request.IsAjaxRequest: False
Request.IsAuthenticated: False
Request.UserHostAddress: 95.181.58.94
Request.UserHostName: 95.181.58.94
HttpContext.User.Identity:
ExceptionContext.RouteData: System.Web.Routing.RouteData
DateTime: 19.06.2013 8:09:35
Обработка ошибок
HandleErrorAttribute
Ошибки могут возникнуть не только внутри экшна
Global.asax.cs: Application_OnError()
Вынесение общего кода - IHttpModule:
HandleErrorHttpModule
public 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.infoman
twitter: @einfoman
email: infoman@skbkontur.ru

More Related Content

PDF
Изоморфный JavaScript — будущее уже здесь
PDF
Суперсилы Chrome developer tools
PDF
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
PDF
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
PDF
Инструменты разные нужны, инструменты разные важны
PDF
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
PDF
SPA инструменты
PDF
Knockoutjs на примере 2ГИС-Онлайн
Изоморфный JavaScript — будущее уже здесь
Суперсилы Chrome developer tools
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Инструменты разные нужны, инструменты разные важны
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
SPA инструменты
Knockoutjs на примере 2ГИС-Онлайн

What's hot (20)

PDF
Modules and assembling of JavaScript (in russian)
PDF
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
PDF
Basis.js – «под капотом»
PDF
Опыт разработки эффективного SPA
PDF
TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.
PDF
Инструментируй это
PDF
Unit-тестирование скриншотами: преодолеваем звуковой барьер
PDF
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
PDF
Иван Карев — Клиентская оптимизация
PDF
Frontendlab: Фреймворк Duranda js - Виктор Сотов
PDF
Лучший frontend-фреймворк, и почему вы его не хотите
PDF
Сергей Константинов — Что интересного готовит нам W3C
PPT
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
PDF
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
PDF
МРТ для данных, Frontend Conf 2016
PPTX
weFramework 1.0 (с) wexpert.ru
PDF
WebCamp 2016: Front-end. Андрей Ситник: Stylelint — как и зачем линтить CSS
PDF
Артём Поликарпов - Фоторама - простая и мощная галерея на JS | Happydev'12
PDF
Svyatoslav Login "360 View of XSS"
PPTX
XSS. Обходы фильтров и защит.
Modules and assembling of JavaScript (in russian)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Basis.js – «под капотом»
Опыт разработки эффективного SPA
TК°Conf. Stylelint — как и зачем линтить CSS. Андрей Ситник.
Инструментируй это
Unit-тестирование скриншотами: преодолеваем звуковой барьер
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Иван Карев — Клиентская оптимизация
Frontendlab: Фреймворк Duranda js - Виктор Сотов
Лучший frontend-фреймворк, и почему вы его не хотите
Сергей Константинов — Что интересного готовит нам W3C
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
МРТ для данных, Frontend Conf 2016
weFramework 1.0 (с) wexpert.ru
WebCamp 2016: Front-end. Андрей Ситник: Stylelint — как и зачем линтить CSS
Артём Поликарпов - Фоторама - простая и мощная галерея на JS | Happydev'12
Svyatoslav Login "360 View of XSS"
XSS. Обходы фильтров и защит.
Ad

Viewers also liked (20)

PDF
Развитие веб-студии: Нужны ли менеджеры?
PDF
inXL web-integrator showcase
PDF
Презентация веб-студии KTC digital production
PPTX
WebProfy.ru — о компании
PDF
Почему агентству интернет-рекламы, веб-студии или РА невыгодно развивать напр...
PPTX
PrestaShop - сертификация веб студий и фрилансеров
PPTX
Презентация услуг по дизайну веб-студии MVACorp
PDF
OSA - digital agency
PDF
Презентация компании "Stativa". Презентация компании пример. Презентация фирм...
PPTX
Как разработать сложный сайт, интегрированный в маркетинговую стратегию вашей...
PDF
MST Digital agency
PDF
Презентация о презентациях
PPTX
Digital Marketing Agency Presentation
PDF
Презентация стартапа
PDF
Презентация высокого полета экспресс курс
PDF
What 33 Successful Entrepreneurs Learned From Failure
PDF
The Minimum Loveable Product
PDF
The History of SEO
PPTX
How People Really Hold and Touch (their Phones)
PDF
Displaying Data
Развитие веб-студии: Нужны ли менеджеры?
inXL web-integrator showcase
Презентация веб-студии KTC digital production
WebProfy.ru — о компании
Почему агентству интернет-рекламы, веб-студии или РА невыгодно развивать напр...
PrestaShop - сертификация веб студий и фрилансеров
Презентация услуг по дизайну веб-студии MVACorp
OSA - digital agency
Презентация компании "Stativa". Презентация компании пример. Презентация фирм...
Как разработать сложный сайт, интегрированный в маркетинговую стратегию вашей...
MST Digital agency
Презентация о презентациях
Digital Marketing Agency Presentation
Презентация стартапа
Презентация высокого полета экспресс курс
What 33 Successful Entrepreneurs Learned From Failure
The Minimum Loveable Product
The History of SEO
How People Really Hold and Touch (their Phones)
Displaying Data
Ad

Similar to Опыт работы с фреймворком ASP.NET MVC (20)

PDF
C# Web. Занятие 10.
PPTX
Референсная архитектура приложения на ASP.NET MVC
PDF
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
PPTX
ASP.NET, MVC, ASP.NET MVC
PPTX
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
PDF
Backbone js
PPT
ASP.NET MVC: new era?
PPTX
ASP.NET MVC
PPTX
RESTful API: Best practices, versioning, design documentation
PPT
Арсений Заречнев и Федор Шумов - Одностраничные приложения
PDF
C# Web. Занятие 11.
PDF
Ember.js ответ на почти все вопросы - java script frameworks day 2014
PDF
Корпоративное приложение на Rails
PDF
Арсений Заречнев и Федор Шумов - Одностраничные приложения
PDF
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
PPTX
ASP.NET MVC 3 Anton Vidishchev
PPTX
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
PDF
C# Web. Занятие 09.
PDF
Не бойся, это всего лишь данные... просто их много
PPTX
CiklumNetSat17032012SergeyKalinets- FubuMVC
C# Web. Занятие 10.
Референсная архитектура приложения на ASP.NET MVC
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET, MVC, ASP.NET MVC
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
Backbone js
ASP.NET MVC: new era?
ASP.NET MVC
RESTful API: Best practices, versioning, design documentation
Арсений Заречнев и Федор Шумов - Одностраничные приложения
C# Web. Занятие 11.
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Корпоративное приложение на Rails
Арсений Заречнев и Федор Шумов - Одностраничные приложения
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
ASP.NET MVC 3 Anton Vidishchev
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
C# Web. Занятие 09.
Не бойся, это всего лишь данные... просто их много
CiklumNetSat17032012SergeyKalinets- FubuMVC

More from Даниил Силантьев (20)

PDF
презентация Huawei
PDF
Перспективы развития услуг мобльной передачи данных
PPT
13. Роман Фадеев "Правовые риски в email маркетинге"
PPTX
11. Кудренко Дмитрий "Неизвестный email-маркетинг"
PPTX
7. николаев леонид mail con_2015
PPTX
10. Рысь Александр "Контент в email маркетинге: 10 работающих идей"
PDF
9. Ильин Владимир Сегментация и персонализация в емейл-маркетинге
PPTX
8. Савицкая Юлия Стратегия email маркетинга: как сэкономить время, средства ...
PDF
12. Иван Шкиря "Почта в одном b2b-сервисе"
PDF
4. Сас Андрей "email-маркетинг на крупных базах подписчиков"
PPTX
6. Александр Пуртов "Репутационные оценки рассылок"
PPTX
1. Силантьев Даниил "email-маркетинг с опорой на конкурентов"
PDF
3. Дмитрий Пивоваров — "опыт e96 в рассылках"
PDF
Проект Timejob
PPTX
Проект СлейКнигу
PPT
Email-маркетинг (для) уральских компаний
PPT
Думай как подписчик. Лайфхаки емэйл-маркетолога
PPT
ВЕЧЕР EMAIL-МАРКЕТИНГА В ЕКАТЕРИНБУРГЕ
PPT
Email-маркетинг для ИТ-компаний
PPT
Email-маркетинг для организаторов мероприятий
презентация Huawei
Перспективы развития услуг мобльной передачи данных
13. Роман Фадеев "Правовые риски в email маркетинге"
11. Кудренко Дмитрий "Неизвестный email-маркетинг"
7. николаев леонид mail con_2015
10. Рысь Александр "Контент в email маркетинге: 10 работающих идей"
9. Ильин Владимир Сегментация и персонализация в емейл-маркетинге
8. Савицкая Юлия Стратегия email маркетинга: как сэкономить время, средства ...
12. Иван Шкиря "Почта в одном b2b-сервисе"
4. Сас Андрей "email-маркетинг на крупных базах подписчиков"
6. Александр Пуртов "Репутационные оценки рассылок"
1. Силантьев Даниил "email-маркетинг с опорой на конкурентов"
3. Дмитрий Пивоваров — "опыт e96 в рассылках"
Проект Timejob
Проект СлейКнигу
Email-маркетинг (для) уральских компаний
Думай как подписчик. Лайфхаки емэйл-маркетолога
ВЕЧЕР EMAIL-МАРКЕТИНГА В ЕКАТЕРИНБУРГЕ
Email-маркетинг для ИТ-компаний
Email-маркетинг для организаторов мероприятий

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