Порівняно з веб-формами, MVC є одночасно підходом нижчого рівня до генерування HTML з більшим контролем над публікацією сторінки та підходом архітектури більш високого рівня. Дозвольте мені захопити Web Forms та MVC і покажу, чому я вважаю, що порівняння надає перевагу веб-формам у багатьох ситуаціях - до тих пір, поки ви не потрапите в якісь класичні пастки веб-форм.
Веб-форми
У моделі Web Forms ваші сторінки відповідають запиту сторінки у веб-переглядачі. Таким чином, якщо ви скеровуєте користувача до списку Книг, ви, ймовірно, матимете сторінку десь під назвою "Booklist.aspx", на яку ви будете спрямовувати його. На цій сторінці ви повинні надати все необхідне для показу цього списку. Сюди входить код для отримання даних, застосування будь-якої логіки бізнесу та відображення результатів. Якщо якась архітектурна або маршрутизаційна логіка впливає на сторінку, вам доведеться також кодувати архітектурну логіку на сторінці. Хороша розробка веб-форм, як правило, передбачає розробку набору допоміжних класів в окремій (тестованій для блоку) DLL. Ці класи будуть обробляти бізнес-логіку, доступ до даних та архітектурні / маршрутизаційні рішення.
MVC
MVC займає більш "архітектурний" погляд на розробку веб-додатків: пропонує стандартизований ешафот, на якому можна будувати. Він також пропонує інструменти для автоматичного генерування класів моделей, перегляду та контролерів у межах встановленої архітектури. Наприклад, і в Ruby on Rails (просто "Rails" звідси), і в ASP.NET MVC ви завжди будете починати зі структури каталогів, яка відображає їх загальну модель архітектури веб-додатків. Щоб додати вигляд, модель та контролер, ви скористаєтесь командою на кшталт Rails "Сценарій Rails / генерувати риштування {modelname}" (ASP.NET MVC пропонує подібні команди в IDE). У результуючому класі контролера знайдуться методи ("Дії") для Index (показ списку), Show, New і Edit та Destroy (принаймні у Rails, MVC схожий). За замовчуванням ці "
Розташування каталогів та файлів є важливим у MVC. Наприклад, в ASP.NET MVC метод Index для об’єкта "Book", ймовірно, матиме лише один рядок: "Return View ();" Завдяки магії MVC це перетворить модель Книги на сторінку "/View/Books/Index.aspx", де ви знайдете код для відображення книг. Підхід Рейлса схожий, хоча логіка трохи більш чітка і менш "магія". Сторінка перегляду в додатку MVC зазвичай простіша, ніж сторінка Web Forms, оскільки їм не потрібно так сильно хвилюватися щодо маршрутизації, ділової логіки чи обробки даних.
Порівняння
Переваги MVC полягають у чистому розділенні проблем та більш чистій, більш HTML-CSS / AJAX / Javascript-орієнтованій моделі для отримання результатів. Це підвищує доказовість, забезпечує більш стандартизований дизайн і відкриває двері до більш веб-сайту типу "Web 2.0".
Однак є і деякі суттєві недоліки.
По-перше, хоча демонструвати сайт легко, але загальна архітектурна модель має значну криву навчання. Коли вони кажуть "Конвенція про конфігурацію", це звучить добре - доки ти не зрозумієш, що ти маєш конвенцію, яку варто навчитись книзі. Крім того, часто трохи розум , щоб зрозуміти, що відбувається , тому що ви будете покладатися на магії , а не явні викликів. Наприклад, що "View View ();" зателефонувати вище? Точний же дзвінок можна знайти в інших акціях, але вони ходять у різні місця. Якщо ви розумієте конвенцію MVCтоді ви знаєте, чому це робиться. Однак це, безумовно, не є прикладом хорошого іменування або легко зрозумілого коду, а новим розробникам набагато важче підібрати, ніж Web Forms (це не лише думка: у минулому році я літній стажер вивчав веб-форми та MVC цього року та різниці в продуктивності були виражені - на користь Web Forms). До речі, Rails є дещо кращим у цьому плані, хоча Ruby on Rails має динамічно названі методи, які також потребують серйозного звикання.
По-друге, MVC неявно передбачає, що ви створюєте класичний веб-сайт у стилі CRUD. Архітектурні рішення, а особливо генератори коду, створені для підтримки такого типу веб-додатків. Якщо ви будуєте додаток CRUD і хочете прийняти перевірену архітектуру (або просто не подобається дизайн архітектури), то, ймовірно, слід врахувати MVC. Однак, якщо ви робите більше, ніж CRUD та / або ви досить грамотно знаєте архітектуру, то MVC може відчувати себе прямолінійною курткою, поки ви справді не освоїте базову модель маршрутизації (що значно складніше, ніж просто маршрутизація в додатку WebForms). Вже тоді я відчував, що завжди боровся з моделлю і переживаю за несподівані результати.
По-третє, якщо вам не байдуже Linq (або тому, що ви боїтесь, що Linq-SQL зникне, або тому, що ви вважаєте, що Linq-to-Entities смішно переробляється і працює під напругою), ви також не хочете пройти цей шлях, оскільки навколо Linq створено інструменти для риштування ASP.NET MVC (це було вбивцею для мене). Модель даних Rails також досить незграбна в порівнянні з тим, чого ви можете досягти, якщо у вас є досвід SQL (особливо, якщо ви добре розбираєтесь у TSQL і зберігаєте процедури!).
По-четверте, прихильники MVC часто зазначають, що погляди MVC за духом ближче до моделі HTML / CSS / AJAX в Інтернеті. Наприклад, "HTML Helpers" - маленькі дзвінки з коду на вашій веб-сторінці, які розміщують вміст і розміщують його в елементах керування HTML - набагато простіше інтегруватися з Javascript, ніж елементи керування Web Forms. Однак 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. Без винятку, зуби сильно стискаються, оскільки розробники виявляють, що вони не можуть виконувати основні завдання, не перестрибуючи обручі або переносячи величезну криву навчання. Це те, що робить веб-форми вищими за MVC в моїй книзі: MVC змушує вас заплатити реальну світову ціну , щоб отримати трохи більше перевіреності або, що ще гірше, просто вважати себе крутим, оскільки ви використовуєтеновітні технології.
Оновлення: у розділі коментарів я сильно критикувався - деякі з них цілком справедливі. Таким чином, я витратив кілька місяців на вивчення Rails та ASP.NET MVC, щоб переконатися, що я насправді не пропустив наступну велику річ! Звичайно, це також допомагає забезпечити збалансовану та відповідну відповідь на питання. Ви повинні знати, що наведена відповідь є основним переписом моєї початкової відповіді на випадок, якщо коментарі здаються синхронізованими.
Поки я пильніше придивлявся до MVC, я на деякий час подумав, що закінчуся великою мірою. Врешті-решт я зробив висновок, що, хоча я думаю, що нам потрібно витратити набагато більше енергії на архітектуру та перевірку веб-форм, MVC насправді не відповідає на дзвінок для мене. Отже, щире "дякую" людям, які надавали розумні критики моєї первинної відповіді.
Щодо тих, хто сприймав це як релігійну битву і хто без зусиль спроектував повені, я не розумію, чому ви турбуєтесь (20+ голосів за кілька разів один за одним багато разів, звичайно, це не нормально). Якщо ви читаєте цю відповідь і цікавитесь, чи є щось справді "неправильне" у моїй відповіді, враховуючи, що оцінка набагато нижча, ніж деякі інші відповіді, будьте впевнені, що вона говорить більше про кілька людей, які не згодні, ніж загальний сенс громада (загалом ця група була оскаржена набагато більше 100 разів).
Справа в тому, що багато розробників не піклуються про MVC, і, справді, це не є меншинним поглядом (навіть у межах MS, як показують блоги).