Comparado aos Web Forms, o MVC é simultaneamente uma abordagem de nível inferior à geração de HTML, com maior controle sobre a saída da página e uma abordagem de nível superior e mais orientada pela arquitetura. Deixe-me capturar Web Forms e MVC e mostrar por que acho que a comparação favorece Web Forms em muitas situações - desde que você não caia em algumas armadilhas clássicas de Web Forms.
Formulários da Web
No modelo de formulários da Web, suas páginas correspondem diretamente à solicitação de página do navegador. Portanto, se você estiver direcionando um usuário para uma lista de livros, provavelmente terá uma página em algum lugar chamada "Booklist.aspx" para a qual o direcionará. Nessa página, você precisará fornecer tudo o que é necessário para mostrar essa lista. Isso inclui código para extrair dados, aplicar qualquer lógica comercial e exibir os resultados. Se houver alguma lógica de arquitetura ou de roteamento afetando a página, você também precisará codificar a lógica de arquitetura na página. O bom desenvolvimento de formulários da Web geralmente envolve o desenvolvimento de um conjunto de classes de suporte em uma DLL separada (testável por unidade). Essas classes lidarão com lógica de negócios, acesso a dados e decisões de arquitetura / roteamento.
MVC
O MVC adota uma visão mais "arquitetônica" do desenvolvimento de aplicativos da Web: oferecendo um andaime padronizado sobre o qual construir. Ele também fornece ferramentas para gerar automaticamente classes de modelo, exibição e controlador dentro da arquitetura estabelecida. Por exemplo, no Ruby on Rails (apenas "Rails" daqui em diante) e no ASP.NET MVC, você sempre começará com uma estrutura de diretórios que reflete seu modelo geral de arquitetura de aplicativos da web. Para adicionar uma visualização, modelo e controlador, você usará um comando como o "Rails script / generate scaffold {modelname}" (o ASP.NET MVC oferece comandos semelhantes no IDE). Na classe de controlador resultante, haverá métodos ("Actions") para Index (show list), Show, New e Edit and Destroy (pelo menos no Rails, o MVC é semelhante). Por padrão, esses "
O layout dos diretórios e arquivos é significativo no MVC. Por exemplo, no ASP.NET MVC, o método Index para um objeto "Book" provavelmente terá apenas uma linha: "Return View ();" Através da magia do MVC, isso enviará o modelo de livro para a página "/View/Books/Index.aspx", onde você encontrará o código para exibir os livros. A abordagem do Rails é semelhante, embora a lógica seja um pouco mais explícita e menos "mágica". Uma página Visualizar em um aplicativo MVC geralmente é mais simples que uma página de Formulários da Web, porque eles não precisam se preocupar tanto com roteamento, lógica comercial ou manipulação de dados.
Comparação
As vantagens do MVC giram em torno de uma separação clara de preocupações e um modelo mais limpo, mais centrado em HTML / CSS / AJAX / Javascript, para produzir sua saída. Isso aprimora a capacidade de teste, fornece um design mais padronizado e abre as portas para um site mais "Web 2.0".
No entanto, existem algumas desvantagens significativas também.
Primeiro, embora seja fácil obter um site de demonstração, o modelo de arquitetura geral tem uma curva de aprendizado significativa. Quando eles dizem "Convenção sobre configuração", parece bom - até você perceber que tem um livro de convenções para aprender. Além disso, é muitas vezes uma enlouquecedora pouco para descobrir o que está acontecendo porque você está contando com a magia em vez de chamadas explícitas. Por exemplo, esse "Return View ();" ligar acima? A mesma chamada exata pode ser encontrada em outras ações, mas elas vão para lugares diferentes. Se você entende a convenção MVCentão você sabe por que isso é feito. No entanto, certamente não se qualifica como um exemplo de boa nomeação ou código facilmente compreensível e é muito mais difícil para os novos desenvolvedores entender do que os Web Forms (isso não é apenas uma opinião: eu tive um estagiário de verão aprendendo Web Forms no ano passado e MVC este ano e as diferenças de produtividade foram pronunciadas - a favor dos Web Forms). Aliás, o Rails é um pouco melhor nesse aspecto, embora o Ruby on Rails possua métodos denominados dinamicamente, que também precisam ser acostumados.
Segundo, o MVC assume implicitamente que você está construindo um site clássico no estilo CRUD. As decisões de arquitetura e, especialmente, os geradores de código são todos criados para suportar esse tipo de aplicativo da web. Se você estiver criando um aplicativo CRUD e quiser adotar uma arquitetura comprovada (ou simplesmente não gostar do design da arquitetura), provavelmente deverá considerar o MVC. No entanto, se você estiver fazendo mais do que CRUD e / ou for razoavelmente competente com a arquitetura, o MVC poderá parecer uma camisa de força até que você realmente domine o modelo de roteamento subjacente (que é consideravelmente mais complexo do que simplesmente rotear em um aplicativo WebForms). Mesmo assim, senti que estava sempre lutando contra o modelo e preocupado com resultados inesperados.
Terceiro, se você não se importa com o Linq (porque tem medo de que o Linq-to-SQL desapareça ou porque você acha que o Linq-to-Entities é ridiculamente superproduzido e com pouca energia), então você também não quer seguir esse caminho, já que as ferramentas de andaime do ASP.NET MVC são criadas em torno do Linq (esse foi o assassino para mim). O modelo de dados do Rails também é bastante desajeitado em comparação com o que você pode obter se tiver experiência em SQL (e especialmente se você for versado em TSQL e procedimentos armazenados!).
Quarto, os proponentes do MVC geralmente apontam que as visualizações do MVC estão mais próximas do modelo HTML / CSS / AJAX da web. Por exemplo, "HTML Helpers" - as pequenas chamadas de código em sua página vew que trocam conteúdo e as colocam em controles HTML - são muito mais fáceis de integrar com Javascript do que controles Web Forms. No entanto, o ASP.NET 4.0 introduz a capacidade de nomear seus controles e, assim, elimina amplamente essa vantagem.
Em quinto lugar, os puristas do MVC costumam ridicularizar o Viewstate. Em alguns casos, eles têm razão em fazê-lo. No entanto, o Viewstate também pode ser uma ótima ferramenta e um benefício para a produtividade. A título de comparação, lidar com o Viewstate é muito mais fácil do que tentar integrar controles da web de terceiros em um aplicativo MVC. Embora a integração de controle possa ficar mais fácil para o MVC, todos os esforços atuais que vi sofrem com a necessidade de criar código (um tanto grody) para vincular esses controles à classe Controller da visualização (ou seja, para contornar o modelo MVC )
Conclusões
Eu gosto do desenvolvimento do MVC de várias maneiras (embora eu prefira o Rails ao ASP.NET MVC por muito tempo). Eu também acho que é importante não cair na armadilha de pensar que o ASP.NET MVC é um "antipadrão" do ASP.NET Web Forms. Eles são diferentes, mas não completamente alienígenas e certamente há espaço para ambos.
No entanto, prefiro o desenvolvimento de Web Forms porque, para a maioria das tarefas , é simplesmente mais fácil realizar as tarefas (a exceção é a geração de um conjunto de formulários CRUD). O MVC também parece sofrer, em certa medida, com um excesso de teoria. De fato, observe as muitas perguntas feitas aqui no SO por pessoas que conhecem o ASP.NET orientado a página, mas que estão tentando o MVC. Sem exceção, há muito ranger de dentes, pois os desenvolvedores descobrem que não podem executar tarefas básicas sem pular os aros ou suportar uma enorme curva de aprendizado. Isto é o que faz Web Forms superiores a MVC em meu livro: MVC faz você pagar um preço mundo real , a fim de ganhar um pouco mais de capacidade de teste ou, pior ainda, simplesmente ser visto como legal porque você está usando otecnologia mais recente.
Atualização: Fui muito criticado na seção de comentários - alguns deles bastante justos. Assim, passei vários meses aprendendo Rails e ASP.NET MVC apenas para garantir que eu realmente não estivesse perdendo a próxima grande novidade! Obviamente, isso também ajuda a garantir que eu forneça uma resposta equilibrada e apropriada à pergunta. Você deve saber que a resposta acima é uma reescrita importante da minha resposta inicial, caso os comentários pareçam estar fora de sincronia.
Enquanto eu olhava mais de perto para o MVC, pensei, por um tempo, que acabaria com uma grande mea culpa. No final, concluí que, embora eu ache que precisamos gastar muito mais energia na arquitetura e na testabilidade de formulários da Web, o MVC realmente não responde à chamada para mim. Então, um sincero "obrigado" às pessoas que forneceram críticas inteligentes à minha resposta inicial.
Quanto àqueles que viram isso como uma batalha religiosa e que incansavelmente projetaram inundações com votos negativos, não entendo por que você se incomoda (mais de 20 votos negativos em segundos um do outro em várias ocasiões certamente não é normal). Se você está lendo esta resposta e se perguntando se há algo realmente "errado" na minha resposta, uma vez que a pontuação é muito menor do que algumas das outras respostas, tenha certeza de que ela diz mais sobre algumas pessoas que discordam do que o senso geral de a comunidade (no geral, essa foi votada mais de 100 vezes).
O fato é que muitos desenvolvedores não se importam com o MVC e, de fato, essa não é uma visão minoritária (mesmo no MS, como os blogs parecem indicar).