Rispetto ai Web Form, MVC è contemporaneamente un approccio di livello inferiore alla generazione di HTML con un maggiore controllo sull'output della pagina e un approccio di livello superiore, più guidato dall'architettura. Consentitemi di acquisire Web Form e MVC e di mostrare perché penso che il confronto favorisca i Web Form in molte situazioni, purché non cadiate in alcune trappole di Web Form classici.
Moduli Web
Nel modello Web Form, le tue pagine corrispondono direttamente alla richiesta di pagina dal browser. Pertanto, se stai indirizzando un utente a un elenco di libri, probabilmente avrai una pagina da qualche parte chiamata "Booklist.aspx" a cui lo indirizzerai. In quella pagina, dovrai fornire tutto il necessario per mostrare tale elenco. Ciò include il codice per l'estrazione di dati, l'applicazione di qualsiasi logica aziendale e la visualizzazione dei risultati. Se c'è qualche logica architettonica o di routing che influenza la pagina, dovrai codificare anche la logica architettonica sulla pagina. Lo sviluppo di buoni moduli Web di solito comporta lo sviluppo di un insieme di classi di supporto in una DLL separata (testabile dall'unità). Queste classi gestiranno la logica aziendale, l'accesso ai dati e le decisioni di architettura / routing.
MVC
MVC ha una visione più "architettonica" dello sviluppo di applicazioni web: offre uno scaffold standardizzato su cui costruire. Fornisce inoltre strumenti per la generazione automatica di classi di modelli, viste e controller all'interno dell'architettura stabilita. Ad esempio, sia in Ruby on Rails (solo "Rails" da qui in avanti) che in ASP.NET MVC inizierai sempre con una struttura di directory che riflette il loro modello generale di architettura delle applicazioni web. Per aggiungere una vista, un modello e un controller, utilizzerai un comando come "Script Rails / generate scaffold {nome modello}" (ASP.NET MVC offre comandi simili nell'IDE). Nella classe di controller risultante, ci saranno metodi ("Azioni") per Index (mostra elenco), Show, New e Edit e Destroy (almeno in Rails, MVC è simile). Per impostazione predefinita, questi "
Il layout di directory e file è significativo in MVC. Ad esempio, in ASP.NET MVC, il metodo Index per un oggetto "Libro" avrà probabilmente solo una riga: "Return View ();" Attraverso la magia di MVC, questo invierà il modello del libro alla pagina "/View/Books/Index.aspx" dove troverai il codice per visualizzare i libri. L'approccio di Rails è simile sebbene la logica sia un po 'più esplicita e meno "magica". Una pagina Visualizza in un'app MVC è in genere più semplice di una pagina Web Form perché non devono preoccuparsi troppo di routing, logica aziendale o gestione dei dati.
Confronto
I vantaggi di MVC consistono in una netta separazione delle preoccupazioni e in un modello più pulito, più HTML / CSS / AJAX / Javascript per produrre il tuo output. Ciò migliora la testabilità, fornisce un design più standardizzato e apre le porte a un tipo di sito Web più "Web 2.0".
Tuttavia, ci sono anche alcuni svantaggi significativi.
Innanzitutto, mentre è facile avviare un sito dimostrativo, il modello architettonico complessivo presenta una curva di apprendimento significativa. Quando dicono "Convention Over Configuration" suona bene - fino a quando non ti rendi conto di avere un libro di convenzioni da imparare. Inoltre, è spesso un po 'esasperante per capire cosa sta succedendo, perché si sta contando sulla magia piuttosto che le chiamate esplicite. Ad esempio, "Return View ();" chiamare sopra? La stessa identica chiamata può essere trovata in altre azioni, ma vanno in luoghi diversi. Se capisci la convenzione MVCallora sai perché questo è fatto. Tuttavia, certamente non si qualifica come un esempio di buona denominazione o di codice facilmente comprensibile ed è molto più difficile da raccogliere per i nuovi sviluppatori rispetto ai Web Form (questo non è solo un parere: ho fatto un tirocinante estivo per imparare i Web Form l'anno scorso e MVC quest'anno e le differenze di produttività sono state pronunciate - a favore dei Web Form). A proposito, Rails è un po 'meglio in questo senso, anche se Ruby on Rails offre metodi con nomi dinamici che prendono anche un po' di tempo per abituarsi.
In secondo luogo, MVC presuppone implicitamente che si stia costruendo un classico sito Web in stile CRUD. Le decisioni sull'architettura e in particolare i generatori di codice sono tutti progettati per supportare questo tipo di applicazione web. Se stai creando un'applicazione CRUD e vuoi adottare un'architettura comprovata (o semplicemente non ti piace la progettazione dell'architettura), allora dovresti probabilmente considerare MVC. Tuttavia, se farai più di CRUD e / o sei ragionevolmente competente con l'architettura, MVC potrebbe sembrare una camicia di forza fino a quando non padroneggi davvero il modello di routing sottostante (che è considerevolmente più complesso del semplice routing in un'app WebForms). Anche allora, mi sono sentito come se stessi combattendo sempre il modello e preoccupato per risultati inaspettati.
In terzo luogo, se non ti interessa Linq (o perché hai paura che Linq-to-SQL scompaia o perché trovi Linq-a-Entità ridicolmente sovra-prodotto e sotto-alimentato), allora non vuoi nemmeno percorrere questo percorso poiché gli strumenti di ponteggio ASP.NET MVC sono costruiti attorno a Linq (questo è stato il killer per me). Il modello di dati di Rails è anche piuttosto goffo rispetto a quello che puoi ottenere se hai esperienza in SQL (e specialmente se sei esperto di TSQL e procedure memorizzate!).
In quarto luogo, i sostenitori di MVC sottolineano spesso che le viste MVC sono più vicine nello spirito al modello HTML / CSS / AJAX del web. Ad esempio, "HTML Helpers" - le piccole chiamate di codice nella tua pagina vew che cambiano contenuto e lo inseriscono nei controlli HTML - sono molto più facili da integrare con Javascript rispetto ai controlli Web Forms. Tuttavia, ASP.NET 4.0 introduce la possibilità di assegnare un nome ai controlli e quindi elimina ampiamente questo vantaggio.
In quinto luogo, i puristi MVC spesso deridono Viewstate. In alcuni casi, hanno ragione a farlo. Tuttavia, Viewstate può anche essere un ottimo strumento e un vantaggio per la produttività. A titolo di confronto, la gestione di Viewstate è molto più semplice rispetto al tentativo di integrare controlli Web di terze parti in un'app MVC. Mentre l'integrazione dei controlli può essere più semplice per MVC, tutti gli sforzi attuali che ho visto soffrono della necessità di costruire un codice (un po 'grodoso) per collegare questi controlli alla classe Controller della vista (ovvero - per aggirare il modello MVC ).
conclusioni
Mi piace lo sviluppo di MVC in molti modi (anche se preferisco Rails a ASP.NET MVC da tempo). Penso anche che sia importante non cadere nella trappola di pensare che ASP.NET MVC sia un "anti-pattern" di Web Form ASP.NET. Sono diversi ma non completamente alieni e sicuramente c'è spazio per entrambi.
Tuttavia, preferisco lo sviluppo di moduli Web perché, per la maggior parte delle attività , è semplicemente più semplice eseguire le attività (l'eccezione è la generazione di un set di moduli CRUD). Anche l'MVC sembra soffrire, in una certa misura, di un eccesso di teoria. In effetti, guarda le molte domande poste qui su SO da persone che conoscono ASP.NET orientato alla pagina ma che stanno provando MVC. Senza eccezioni, c'è molto digrignamento dei denti poiché gli sviluppatori scoprono che non possono svolgere compiti di base senza saltare attraverso i cerchi o sopportare un'enorme curva di apprendimento. Questo è ciò che rende Web Forms superiore a MVC nel mio libro: MVC ti fa pagare un prezzo reale al fine di ottenere un po 'più di testabilità o, peggio ancora, di essere semplicemente visto come fico perché stai usando illa più recente tecnologia.
Aggiornamento: sono stato pesantemente criticato nella sezione commenti, alcuni dei quali abbastanza onesti. Quindi, ho trascorso diversi mesi a studiare Rails e ASP.NET MVC solo per assicurarmi di non perdere davvero la prossima grande novità! Naturalmente, aiuta anche a garantire una risposta equilibrata e adeguata alla domanda. Dovresti sapere che la risposta di cui sopra è una riscrittura importante della mia risposta iniziale nel caso in cui i commenti sembrino non sincronizzati.
Mentre guardavo più da vicino in MVC ho pensato, per un po ', che sarei finito con un grande mea culpa. Alla fine ho concluso che, mentre penso che dobbiamo spendere molta più energia per l'architettura e la testabilità di Web Forms, MVC non risponde davvero alla mia chiamata. Quindi, un cordiale "grazie" alla gente che ha fornito critiche intelligenti alla mia risposta iniziale.
Per quanto riguarda coloro che hanno visto questo come una battaglia religiosa e che hanno progettato incessantemente inondazioni di downvote, non capisco perché ti disturbi (più di 20 voti negativi in pochi secondi l'uno dall'altro in più occasioni non è certamente normale). Se stai leggendo questa risposta e ti chiedi se c'è qualcosa di veramente "sbagliato" nella mia risposta, dato che il punteggio è molto più basso di alcune delle altre risposte, ti assicuro che dice di più su alcune persone che non sono d'accordo con il senso generale di la comunità (nel complesso, questa è stata votata oltre 100 volte).
Il fatto è che molti sviluppatori non si occupano di MVC e, in effetti, questa non è una visione di minoranza (anche all'interno della SM come sembrano indicare i blog).