По сравнению с веб-формами MVC одновременно представляет собой низкоуровневый подход к созданию HTML с большим контролем над выводом страницы и более высокоуровневый подход, основанный на архитектуре. Позвольте мне захватить веб-формы и MVC и показать, почему я считаю, что сравнение в пользу веб-форм во многих ситуациях - если вы не попадаете в некоторые классические ловушки веб-форм.
Веб-формы
В модели веб-форм ваши страницы напрямую соответствуют запросу страницы из браузера. Таким образом, если вы направляете пользователя к списку книг, у вас, вероятно, будет где-то страница под названием «Booklist.aspx», на которую вы направите его. На этой странице вам нужно будет предоставить все необходимое для отображения этого списка. Сюда входит код для извлечения данных, применения любой бизнес-логики и отображения результатов. Если на страницу влияет какая-либо архитектурная логика или логика маршрутизации, вам также придется закодировать архитектурную логику на странице. Хорошая разработка веб-форм обычно включает разработку набора поддерживающих классов в отдельной (тестируемой) DLL. Эти классы будут обрабатывать бизнес-логику, доступ к данным и решения по архитектуре / маршрутизации.
MVC
MVC использует более «архитектурный» взгляд на разработку веб-приложений: предлагает стандартизованный каркас, на котором можно строить. Он также предоставляет инструменты для автоматического создания классов моделей, представлений и контроллеров в рамках установленной архитектуры. Например, как в Ruby on Rails (далее просто «Rails»), так и в ASP.NET MVC вы всегда будете начинать со структуры каталогов, которая отражает их общую модель архитектуры веб-приложений. Чтобы добавить представление, модель и контроллер, вы будете использовать команду наподобие Rails "Rails script / generate scaffold {modelname}" (ASP.NET MVC предлагает аналогичные команды в IDE). В результирующем классе контроллера будут методы («Действия») для Index (показать список), Show, New и Edit и Destroy (по крайней мере, в Rails, MVC аналогичен). По умолчанию эти "
Расположение каталогов и файлов имеет большое значение в MVC. Например, в ASP.NET MVC метод Index для объекта «Книга», скорее всего, будет иметь только одну строку: «Return View ();» Благодаря магии MVC модель книги будет отправлена на страницу "/View/Books/Index.aspx", где вы найдете код для отображения книг. Подход Rails аналогичен, хотя логика немного более ясна и менее «волшебна». Просмотр страницы в приложении MVC обычно проще , чем страницы веб - форм , потому что они не должны беспокоиться , как много о маршрутизации, бизнес - логики и обработки данных.
Сравнение
Преимущества MVC заключаются в четком разделении задач и более чистой, более ориентированной на HTML / CSS / AJAX / Javascript модели для создания вашего вывода. Это улучшает тестируемость, обеспечивает более стандартизованный дизайн и открывает дверь к веб-сайту более «Web 2.0».
Однако есть и существенные недостатки.
Во-первых, хотя запустить демонстрационный сайт несложно, общая архитектурная модель требует значительного обучения. Когда они говорят: «Соглашение важнее конфигурации», это звучит хорошо - до тех пор, пока вы не поймете, что вам нужно выучить соглашение, равное книге. Кроме того, часто немного ум , чтобы понять, что происходит , потому что вы будете полагаться на магии , а не явные вызовов. Например, что «Return View ();» позвонить выше? Точно такой же вызов можно найти в других действиях, но они идут в разные места. Если вы понимаете соглашение MVCтогда вы знаете, почему это делается. Тем не менее, это, конечно, не квалифицируется как пример хорошего именования или легко понятного кода, и новичкам намного сложнее подобрать его, чем веб-формы (это не просто мнение: в прошлом году у меня был летний стажер, изучавший веб-формы. и MVC в этом году, и разница в производительности была явной - в пользу веб-форм). Кстати, Rails в этом отношении немного лучше, хотя в Ruby on Rails есть методы с динамическими именами, которые также требуют серьезного привыкания.
Во-вторых, MVC неявно предполагает, что вы создаете классический веб-сайт в стиле CRUD. Архитектурные решения и особенно генераторы кода созданы для поддержки этого типа веб-приложений. Если вы создаете приложение CRUD и хотите принять проверенную архитектуру (или просто не любите архитектурный дизайн), вам, вероятно, следует подумать о MVC. Однако, если вы будете делать больше, чем CRUD, и / или вы достаточно компетентны в архитектуре, тогда MVC может казаться смирительной рубашкой, пока вы действительно не освоите базовую модель маршрутизации (которая значительно сложнее, чем просто маршрутизация в приложении WebForms). Даже тогда мне казалось, что я всегда борюсь с моделью и беспокоюсь о неожиданных результатах.
В-третьих, если вам неинтересен Linq (либо потому, что вы боитесь, что Linq-to-SQL исчезнет, либо из-за того, что вы обнаруживаете, что Linq-to-Entities смехотворно перепроизводятся и недостаточно мощны), тогда вы также не хотите чтобы пройти этот путь, поскольку инструменты формирования шаблонов ASP.NET MVC построены на основе Linq (для меня это было убийцей). Модель данных Rails также довольно неуклюжая по сравнению с тем, чего вы можете достичь, если у вас есть опыт работы с SQL (и особенно если вы хорошо разбираетесь в TSQL и хранимых процедурах!).
В-четвертых, сторонники MVC часто указывают на то, что представления MVC по духу ближе к веб-модели HTML / CSS / AJAX. Например, «Помощники HTML» - небольшие вызовы кода на вашей странице vew, которые меняют содержимое и помещают его в элементы управления HTML - гораздо проще интегрировать с Javascript, чем элементы управления веб-форм. Однако ASP.NET 4.0 предоставляет возможность давать имена элементам управления и, таким образом, в значительной степени устраняет это преимущество.
В-пятых, пуристы MVC часто высмеивают Viewstate. В некоторых случаях они поступают правильно. Однако Viewstate также может быть отличным инструментом и способствовать повышению производительности. Для сравнения: работать с Viewstate намного проще, чем пытаться интегрировать сторонние веб-элементы управления в приложение MVC. Хотя интеграция элементов управления может стать проще для MVC, все текущие усилия, которые я видел, страдают от необходимости создания (несколько уродливого) кода для связывания этих элементов управления с классом контроллера представления (то есть - для работы с моделью MVC ).
Выводы
Мне нравится разработка MVC во многих отношениях (хотя я предпочитаю Rails вместо ASP.NET MVC). Я также считаю, что важно не попадаться в ловушку мысли, что ASP.NET MVC является «анти-шаблоном» веб-форм ASP.NET. Они разные, но не совсем чужды, и, конечно, обоим есть место.
Однако я предпочитаю разработку веб-форм, потому что для большинства задач просто выполнять задачи (исключение составляет создание набора форм CRUD). MVC также, кажется, в некоторой степени страдает от избытка теории. В самом деле, взгляните на многие вопросы, которые задают здесь о SO люди, которые знают страничный ASP.NET, но пробуют MVC. Все без исключения скрипят зубами, поскольку разработчики обнаруживают, что они не могут выполнять базовые задачи, не прыгая через обручи или не преодолевая огромную кривую обучения. Вот что отличает Web Forms от MVC в моей книге: MVC заставляет вас платить реальную цену , чтобы получить немного больше тестируемости или, что еще хуже, чтобы вас просто считали крутой потому что вы используетеновейшей технологией.
Обновление: меня сильно критиковали в разделе комментариев - некоторые из них вполне справедливы. Таким образом, я потратил несколько месяцев на изучение Rails и ASP.NET MVC, чтобы убедиться, что я действительно не упустил следующий важный момент! Конечно, это также помогает обеспечить сбалансированный и адекватный ответ на вопрос. Вы должны знать, что приведенный выше ответ является серьезной переработкой моего первоначального ответа на тот случай, если комментарии кажутся не синхронизированными.
Пока я более внимательно смотрел на MVC, я некоторое время думал, что в конечном итоге столкнусь с серьезной ошибкой. В конце концов я пришел к выводу, что, хотя я думаю, что нам нужно потратить намного больше энергии на архитектуру веб-форм и тестируемость, MVC действительно не отвечает на мой призыв. Итак, сердечное «спасибо» людям, которые предоставили разумную критику моего первоначального ответа.
Что касается тех, кто видел в этом религиозную битву и кто безжалостно спровоцировал наводнения против голосов, я не понимаю, почему вы беспокоитесь (20+ голосов против с интервалом в несколько секунд, конечно, ненормально). Если вы читаете этот ответ и задаетесь вопросом, есть ли что-то действительно «неправильное» в моем ответе, учитывая, что оценка намного ниже, чем в некоторых других ответах, будьте уверены, что он больше говорит о нескольких человек, которые не согласны, чем общее ощущение сообщества (в целом за него проголосовали более 100 раз).
Дело в том, что многие разработчики не заботятся о MVC и, действительно, это не мнение меньшинства (даже внутри MS, как, кажется, указывают блоги).