140 votes

Est-ce que quelqu'un à part moi ne comprend tout simplement PAS ASP.NET MVC?

J'ai bidouillé avec ASP.NET MVC depuis la CTP, et j'aime beaucoup de choses qu'ils ont faites, mais il y a des choses que je ne comprends juste pas.

Par exemple, j'ai téléchargé la beta1, et je suis en train de mettre en place un petit site personnel/cv/blog avec. Voici un extrait de la vue ViewSinglePost :

 <%
        // Afficher les liens "Suivant et Précédent"
        if (ViewData.Model.PreviousPost != null || ViewData.Model.NextPost != null)
        {
            %> 

Dégoûtant! (Remarquez également que le HTML là-bas est temporaire, je vais créer un design réel une fois que la fonctionnalité sera opérationnelle).

Fais-je quelque chose de mal? Parce que j'ai passé de nombreux jours sombres en ASP classique, et cette soupe de balises me rappelle fortement ça.

Tout le monde prêche sur la façon dont vous pouvez obtenir un HTML plus propre. Devinez quoi? 1% de toutes les personnes regardent le HTML généré. Pour moi, je m'en fiche si Webforms gâche ma mise en forme dans le HTML rendu, tant que j'ai un code facile à maintenir...Ce n'est pas le cas!

Alors, convertissez-moi, un fan inconditionnel de webforms, pourquoi je devrais abandonner mes pages ASPX joliment formées pour cela?

Modification : Mise en gras de la ligne "temp Html/css" afin que les gens se taisent à ce sujet.

152voto

Mark Brittingham Points 18970

Par rapport aux Formulaires Web, MVC est à la fois un niveau inférieur à l'approche de la génération HTML avec un plus grand contrôle sur la sortie de la page et un niveau plus élevé, plus l'architecture. Permettez-moi de capturer des Formulaires Web et MVC et de montrer pourquoi je pense que la comparaison des faveurs de Formulaires Web dans de nombreuses situations - tant que vous ne tombez pas dans certains Formulaires Web classique pièges.

Des Formulaires Web

Dans le modèle de Formulaires Web, vos pages correspondent directement à la demande de page à partir du navigateur. Ainsi, si vous êtes dirigeant d'un utilisateur à une liste de Livres, vous aurez probablement une page quelque part appelée "liste compilée.aspx" à laquelle vous allez vous diriger. Dans cette page, vous devez fournir tout le nécessaire pour afficher cette liste. Cela comprend le code pour l'extraction de données, en appliquant une logique métier, et d'afficher les résultats. Si il y a tout de l'architecture ou de la logique de routage qui affectent la page, vous aurez le code de la logique architecturale sur la page. De bonnes Formes de Web développement implique généralement le développement d'un ensemble de classes de support dans un document distinct (unité-testable) DLL. Ces classe(s) de la poignée de la logique métier, accès aux données et de l'architecture et des décisions de routage.

MVC

MVC est plus "architectural" de développement d'applications web: en proposant un standardisé échafaudage sur lequel construire. Il fournit également des outils pour la génération automatique de modèle, vue et contrôleur de classes dans l'architecture. Par exemple, dans les deux Ruby on Rails (juste des "Rails" à partir de maintenant) et ASP.NET MVC, vous allez toujours commencer avec une structure de répertoire qui reflète l'ensemble de leur modèle d'architecture d'application web. Pour ajouter une vue, le modèle et le contrôleur, vous devez utiliser une commande comme des Rails de "Rails script/generate scaffold {nom du modèle}" (ASP.NET MVC offre des commandes similaires dans l'IDE). Dans le contrôleur de classe, il y aura des méthodes (les"Actions") pour les Index (voir la liste), de Montrer, de Nouvelles et de les Éditer et de les Détruire (au moins dans les Rails, MVC est similaire). Par défaut, ces "Obtenir" des Actions en écrivant le Modèle et la voie à une vue correspondante/un fichier html dans le "View/{nom du modèle}" directory (à noter qu'il existe aussi Créer, mettre à Jour et de Détruire des actions de traiter un "Post" et itinéraire vers de l'Indice ou de Spectacle).

La mise en page des répertoires et des fichiers est importante dans MVC. Par exemple, dans ASP.NET MVC, l' Indice de la méthode pour un "Livre objet" sera probablement juste une ligne: "Return View();" Par la magie de la MVC, cela enverra le Livre de modèle à l' "/View/Livres/Index.aspx" page où vous trouverez le code pour afficher les Livres. Rails de l'approche est similaire, bien que la logique est un peu plus explicite et moins de "magie". Une Vue de la page dans une application MVC est généralement plus simple qu'une page Web Forms, car ils n'ont pas à s'inquiéter autant de routage, la logique d'affaires ou de traitement des données.

Comparaison

Les avantages de la MVC tournent autour d'une séparation des préoccupations et un environnement plus propre, plus HTML/CSS/AJAX/Javascript centrée sur le modèle de la production de votre sortie. Cela améliore la capacité de test, offre une meilleure conception normalisée et ouvre la porte à un plus "Web 2.0", le type de site web.

Cependant, il ya certains inconvénients aussi bien.

Tout d'abord, alors qu'il est facile d'obtenir un site de démonstration, l'ensemble architectural modèle a une courbe d'apprentissage importante. Quand ils disent "Convention Over Configuration", ça sonne bien - jusqu'à ce que vous vous rendez compte que vous avez un livre de valeur de la convention d'apprendre. En outre, c'est souvent un peu exaspérant de comprendre ce qui se passe parce que vous êtes en s'appuyant sur la magie plutôt que des appels explicites. Par exemple, que "Return View();" l'appel ci-dessus? Exactement le même appel peut être trouvé dans d'autres Actions, mais ils vont à des endroits différents. Si vous comprenez le MVC convention alors vous savez pourquoi c'est fait. Cependant, il n'est certainement pas considéré comme un exemple de bon de nommer ou de facilement compréhensible par le code, et il est beaucoup plus difficile pour les nouveaux développeurs pour ramasser que des Formulaires Web (ce n'est pas seulement l'opinion: j'ai eu un stage d'été à apprendre des Formulaires Web l'année dernière et MVC cette année, et les différences de productivité ont été prononcées en faveur de Formulaires Web). BTW, Rail est un peu mieux, à cet égard, bien que Ruby on Rails fonctions dynamiquement nommé méthodes qui prennent un certain sérieux se-servir-de.

Deuxièmement, MVC suppose implicitement que vous êtes la construction d'un classique CRUD de style de site web. Les décisions en matière d'architecture et en particulier les générateurs de code sont tous construits pour soutenir ce type d'application web. Si vous êtes à la construction d'une application CRUD et à adopter une architecture éprouvée (ou simplement aversion pour la conception de l'architecture), alors vous devriez probablement envisager MVC. Toutefois, si vous allez faire plus de CRUD et/ou vous êtes assez compétent en architecture puis MVC peut se sentir comme une camisole de force jusqu'à ce que vous avez vraiment maître de la sous-jacentes de routage modèle (qui est beaucoup plus complexe que de simplement le routage dans une application web forms). Même alors, j'ai senti comme si j'étais toujours en lutte le modèle et inquiet des résultats inattendus.

Troisièmement, si vous n'avez pas de soins pour Linq (soit parce que vous avez peur que Linq-to-SQL est en train de disparaître ou parce que vous trouvez Linq-to-Entités laughably sur-produit et sous tension), alors vous ne voulez pas marcher sur ce chemin depuis ASP.NET MVC échafaudage outils sont construits autour de Linq (ce qui était le tueur pour moi). Les Rails du modèle de données est également assez maladroit par rapport à ce que vous pouvez obtenir si vous avez de l'expérience en SQL (et surtout si vous êtes bien versé dans TSQL et des procédures stockées!).

Quatrièmement, MVC partisans soulignent souvent qu'MVC points de vue sont plus proches dans l'esprit de l'HTML/CSS/AJAX modèle de la web. Par exemple, "HTML Helpers" - les appels de code dans votre vew page de swap dans le contenu et de le placer dans le HTML les contrôles sont beaucoup plus facile à intégrer avec Javascript que les contrôles de Formulaires Web. Cependant, ASP.NET 4.0 introduit la possibilité de nommer vos commandes et ainsi élimine en grande partie de cet avantage.

Cinquième, MVC puristes souvent moque de Viewstate. Dans certains cas, ils sont en droit de le faire. Cependant, l'état d'affichage peut aussi être un formidable outil et un atout pour la productivité. À titre de comparaison, la manipulation de l'état d'affichage est beaucoup plus facile que d'essayer d'intégrer tiers des contrôles web dans une application MVC. Tandis que le contrôle de l'intégration peut être plus facile pour MVC, tous les efforts que j'ai vu souffrir de la nécessité de construire (un peu grody) code de liens entre ces contrôles à la vue du Contrôleur de classe (c'est - à contourner le modèle MVC).

Conclusions

J'aime MVC développement de plusieurs façons (bien que je préfère les Rails ASP.NET MVC par un long shot). Je pense aussi que c'est important pour nous de ne pas tomber dans le piège de penser que l'ASP.NET MVC est un "anti-modèle" de ASP.NET les Formulaires Web. Elles sont différentes mais pas complètement étranger et il ya certainement de la place pour les deux.

Cependant, je préfère les Formes de Web développement, car, pour la plupart des tâches, il est simplement plus facile de faire les choses (l'exception étant la génération d'un ensemble de CRUD formes). MVC semble aussi souffrir, dans une certaine mesure, à partir d'un excès de théorie. En effet, regardez le nombre de questions posées ici par des gens qui savent orientées page ASP.NET mais qui tentent MVC. Sans exception, il y a beaucoup de grincements de dents que les développeurs trouvent qu'ils ne peuvent pas effectuer des tâches de base sans sauter à travers des cerceaux ou durable d'un énorme courbe d'apprentissage. C' est ce qui rend les Formulaires Web de qualité supérieure pour MVC dans mon livre: MVC vous fait payer un monde réel prix afin de gagner un peu plus de testabilité ou, pire encore, à être simplement considéré comme cool parce que vous êtes à l'aide de la technologie la plus récente.

Mise à jour: j'ai été critiqué fortement dans la section des commentaires, en partie tout à fait juste. Ainsi, j'ai passé plusieurs mois à apprendre Rails et ASP.NET MVC juste pour s'assurer que je n'étais pas vraiment absent dehors sur la prochaine grande chose! Bien sûr, il permet également de s'assurer que je donne un équilibre et une réponse appropriée à la question. Vous devez savoir que la réponse ci-dessus est une réécriture majeure de mon début de réponse dans le cas où les commentaires semblent désynchronisés.

Alors que j'étais à la recherche de plus près MVC, j'ai pensé que, pour un peu de temps, que je finirais avec un grand mea culpa. En fin de compte j'en ai conclu que, bien que je pense que nous avons besoin de dépenser beaucoup plus d'énergie sur des Formulaires Web de l'architecture et de la testabilité, MVC n'a vraiment pas de répondre à l'appel pour moi. Donc, un chaleureux "merci" pour les gens qui ont fourni intelligent critiques de ma première réponse.

Pour ceux qui ont vu cela comme un religieux de bataille et qui n'ont de cesse d'ingénierie downvote inondations, je ne comprends pas pourquoi vous vous donnez la peine (20+ bas-voix à l'intérieur de secondes l'un de l'autre, à plusieurs reprises, n'est certainement pas normal). Si vous êtes à la lecture de cette réponse et je me demandais si il y a quelque chose de "mal" à propos de ma réponse étant donné que le score est beaucoup plus faible que celle de certains autres réponses, soyez assuré qu'il en dit plus sur quelques personnes qui sont en désaccord que le sens général de la communauté (en général, celui-ci a été upvoted plus de 100 fois).

Le fait est que beaucoup de développeurs ne se soucient pas de MVC et, en effet, ce n'est pas un point de vue minoritaire (même à l'intérieur de MME que les blogs semblent indiquer).

117voto

Hugoware Points 13645

MVC vous donne plus de contrôle sur votre sortie, et avec ce contrôle vient un risque plus grand d'écrire un HTML mal conçu, de la soupe de balises, etc...

Mais en même temps, vous avez plusieurs nouvelles options que vous n'aviez pas avant...

  1. Plus de contrôle sur la page et les éléments à l'intérieur de la page
  2. Moins de "fioritures" dans votre sortie, comme le ViewState ou les IDs excessivement longs sur les éléments (ne vous méprenez pas, j'aime le ViewState)
  3. Meilleure capacité de faire de la programmation côté client avec Javascript (des applications Web 2.0, quelqu'un ?)
  4. Pas seulement MVC, mais JsonResult est bien fait...

Cela ne veut pas dire que vous ne pouvez pas faire ces choses avec WebForms, mais MVC rend les choses plus faciles.

J'utilise toujours WebForms quand j'ai besoin de créer rapidement une application web car je peux profiter des contrôles serveur, etc. WebForms cache tous les détails des balises de saisie et des boutons de soumission.

WebForms et MVC peuvent tous deux produire de la mauvaise qualité si vous êtes négligent. Comme toujours, une planification minutieuse et une conception bien réfléchie aboutiront à une application de qualité, que ce soit en MVC ou en WebForms.

[Mise à jour]

Pour vous rassurer également, MVC est simplement une nouvelle technologie en évolution de Microsoft. De nombreux articles affirment que WebForms ne disparaîtra pas, mais continuera à être développé...

http://haacked.com

http://www.misfitgeek.com

http://rachelappel.com

... et ainsi de suite...

Pour ceux qui s'inquiètent de la direction prise par MVC, je suggère de donner "vos commentaires" aux développeurs. Jusqu'à présent, ils semblent écouter !

76voto

J Wynia Points 4679

La plupart des objections à ASP.NET MVC semblent centrées sur les vues, qui sont l'un des éléments les plus "optionnels" et modulaires de l'architecture. NVelocity, NHaml, Spark, XSLT et autres moteurs de vue peuvent être facilement remplacés (et cela devient de plus en plus facile avec chaque mise à jour). Beaucoup d'entre eux ont une syntaxe BEAUCOUP plus concise pour la logique de présentation et le formatage, tout en offrant un contrôle complet sur le HTML émis.

En dehors de cela, presque chaque critique semble se résumer aux balises <% %> dans les vues par défaut et à quel point c'est "moche". Cette opinion est souvent enracinée dans le fait d'être habitué à l'approche WebForms, qui déplace simplement la plupart la laideur classique d'ASP dans le code-behind.

Même sans mal faire les code-behinds, vous avez des choses comme OnItemDataBound dans les Repeaters, qui est tout aussi esthétiquement laid, mais d'une manière différente, que "tag soup". Une boucle foreach peut être beaucoup plus facile à lire, même avec l'incorporation de variables dans la sortie de cette boucle, notamment si vous venez à MVC à partir d'autres technologies non-ASP.NET. Il est beaucoup moins nécessaire d'avoir une "Google-fu" pour comprendre la boucle foreach que pour savoir que la manière de modifier ce champ spécifique dans votre repeater est de jouer avec OnItemDataBound (et le nid de contrôles pour savoir s'il s'agit du bon élément à modifier).

Le plus gros problème avec la "spaghetti" pilotée par tag-soup d'ASP était surtout de fourrer des choses comme les connexions de base de données directement entre le HTML.

Le fait que cela se faisait en utilisant des <% %> est juste une corrélation avec la nature spaghetti de classic ASP, pas la cause. Si vous gardez votre logique de vue à du HTML/CSS/Javascript et la logique minimale nécessaire pour faire de la présentation, le reste n'est que syntaxe.

Lorsque vous comparez une fonctionnalité donnée à WebForms, assurez-vous d'inclure tout le C# généré par le designer, et le C# de code-behind avec le code .aspx pour être sûr que la solution MVC n'est vraiment pas, en fait, beaucoup plus simple.

Lorsqu'il est combiné avec une utilisation judicieuse de vues partielles pour des éléments répétitifs de logique de présentation, cela peut vraiment être agréable et élégant.

Personnellement, je souhaite que la plupart du contenu des premiers tutoriels se concentre davantage sur cette facette que presque exclusivement sur le test-driven, l'inversion de contrôle, etc. Alors que ces autres éléments sont ce que les experts critiquent, les gens sur le terrain sont plus susceptibles de critiquer la "tag soup".

Quoi qu'il en soit, cette plateforme est encore en version bêta. Malgré cela, elle est bien plus déployée et des développeurs non-Microsoft construisent des choses réelles avec elle que la plupart des technologies beta de Microsoft. En tant que tel, le buzz tend à donner l'impression qu'elle est plus avancée que l'infrastructure qui l'entoure (documentation, modèles de guidance, etc). Le fait qu'elle soit réellement utilisable à ce stade amplifie cet effet.

59voto

Todd Smith Points 8297
<% if (Model.PreviousPost || Model.NextPost) { %>

        <% if (Model.PreviousPost) { %>
            <% Html.ActionLink("<< " + Model.PreviousPost.Subject, "view")); %>
        <% } if (Model.NextPost) { %>
            <% Html.ActionLink(Model.NextPost.Subject + " >>", "view")); %>
        <% } %>

<% } %>

Vous pouvez faire un autre message demandant comment faire cela sans inclure le CSS embarqué.

NOTE: ViewData.Model devient Model dans la prochaine version.

Et avec l'aide d'un contrôle utilisateur, cela deviendrait

<% Html.RenderPartial("Pager", Model.PagerData) %>

où PagerData est initialisé via un constructeur anonyme dans le gestionnaire d'actions.

édition : Je suis curieux de voir à quoi ressemblerait votre implémentation de WebForm pour ce problème.

25voto

Tom Anderson Points 7228

Je ne suis pas sûr à quel moment les gens ont arrêté de se soucier de leur code.

HTML est la vitrine la plus publique de votre travail, il y a BEAUCOUP de développeurs qui utilisent notepad, notepad++, et d'autres éditeurs de texte brut pour construire beaucoup de sites web.

MVC consiste à reprendre le contrôle des formulaires web, à travailler dans un environnement sans état, et à implémenter le modèle Vue Contrôleur sans tout le travail supplémentaire qui se produit normalement dans une implémentation de ce modèle.

Si vous voulez du contrôle, un code propre, et utiliser des motifs de conception MVC, c'est pour vous, si vous n'aimez pas travailler avec le balisage, que vous vous fichez de la façon dont votre balisage devient mal formé, alors utilisez ASP.Net Web Forms.

Si vous n'aimez ni l'un ni l'autre, vous allez certainement faire à peu près autant de travail dans le balisage.

EDIT Je devrais également préciser que les Web Forms et les MVC ont leur place, je ne voulais en aucun cas dire que l'un était meilleur que l'autre, seulement que chaque MVC a la force de reprendre le contrôle sur le balisage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X