Bekommt jemand neben mir einfach NICHT ASP.NET MVC? [geschlossen]

141

Ich habe seit dem CTP mit ASP.NET MVC herumgespielt und ich mag viele Dinge, die sie getan haben, aber es gibt Dinge, die ich einfach nicht verstehe.

Zum Beispiel habe ich Beta1 heruntergeladen und damit eine kleine persönliche Seite / Lebenslauf / Blog zusammengestellt. Hier ist ein Ausschnitt aus der ViewSinglePost-Ansicht:

 <%
        // Display the "Next and Previous" links
        if (ViewData.Model.PreviousPost != null || ViewData.Model.NextPost != null)
        {
            %> <div> <%

            if (ViewData.Model.PreviousPost != null)
            {
                %> <span style="float: left;"> <%
                    Response.Write(Html.ActionLink("<< " + ViewData.Model.PreviousPost.Subject, "view", new { id = ViewData.Model.PreviousPost.Id }));
                %> </span> <%
            }

            if (ViewData.Model.NextPost != null)
            {
                %> <span style="float: right;"> <%
                    Response.Write(Html.ActionLink(ViewData.Model.NextPost.Subject + " >>", "view", new { id = ViewData.Model.NextPost.Id }));
                %> </span> <%
            }
            %>
                   <div style="clear: both;" />
               </div> <%
        }
    %>

Widerlich! (Beachten Sie auch, dass es sich bei dem HTML-Code um temporären Platzhalter-HTML handelt. Sobald die Funktionalität funktioniert, erstelle ich ein tatsächliches Design .)

Mache ich etwas falsch? Weil ich viele dunkle Tage im klassischen ASP verbracht habe und diese Tag-Suppe mich stark daran erinnert.

Jeder predigt, wie man saubereres HTML machen kann. Erraten Sie, was? 1% aller Menschen betrachten das ausgegebene HTML. Für mich ist es egal, ob Webforms meine Einrückung im gerenderten HTML-Code durcheinander bringt, solange ich Code habe, der einfach zu pflegen ist ... Dies ist nicht der Fall!

Also, konvertiere mich, ein eingefleischter Webform-Typ, warum sollte ich meine schön geformten ASPX-Seiten dafür aufgeben?

Bearbeiten: Die Zeile "temp Html / css" ist fett gedruckt, damit die Leute darüber nachdenken.

FlySwat
quelle
3
Mann, das ist ein hässlicher Aufschlag!
Steven A. Lowe
39
Sie fügen CSS-Markup in Ihr HTML ein?
Todd Smith
12
Ihre Formatierung ist scheiße. Das ist kein Problem, das MVC innewohnt, es ist ein Zeichen für einen schlechten HTML-Programmierer. Zu viel Zeit im Beobachtermuster, denke ich. Hier ist etwas mehr als Ziehen, Ablegen und Klicken erforderlich.
Chris
7
Egal, MVC, Winforms als "einfach zu warten" zu bezeichnen, ist dumm. Es ist einfach zu warten, solange Sie keine Kontrolle über die Ausgabe benötigen. Dies bedeutet, dass es einwandfrei funktioniert, solange Ihre Benutzer nur von MS genehmigte Webbrowser verwenden.
Jalf
2
Mache ich etwas falsch? - Ja. Aber es ist nicht deine Schuld. Sie müssen etwas nettes HTML schreiben und dann die Ausgabe des Modells hinzufügen. Sie brauchen keine Antwort. Schreiben Sie jemals! Die Idee hinter dem MVC-Framework ist, dass es die Dinge viel sauberer macht als .aspx, während Ihr Beispiel eher wie klassisches ASP aussieht.
Fenton

Antworten:

152

Im Vergleich zu Web Forms ist MVC gleichzeitig ein Ansatz auf niedrigerer Ebene für die HTML-Generierung mit besserer Kontrolle über die Seitenausgabe und ein übergeordneter, architektonisch orientierter Ansatz. Lassen Sie mich Web Forms und MVC erfassen und zeigen, warum ich denke, dass der Vergleich Web Forms in vielen Situationen bevorzugt - solange Sie nicht in einige klassische Web Forms-Fallen geraten.

Web Forms

Im Web Forms-Modell entsprechen Ihre Seiten direkt der Seitenanforderung des Browsers. Wenn Sie einen Benutzer zu einer Liste von Büchern weiterleiten, haben Sie wahrscheinlich eine Seite mit dem Namen "Booklist.aspx", auf die Sie ihn weiterleiten. Auf dieser Seite müssen Sie alles angeben, was zum Anzeigen dieser Liste erforderlich ist. Dies umfasst Code zum Abrufen von Daten, Anwenden einer beliebigen Geschäftslogik und Anzeigen der Ergebnisse. Wenn sich eine Architektur- oder Routing-Logik auf die Seite auswirkt, müssen Sie auch die Architekturlogik auf der Seite codieren. Eine gute Web Forms-Entwicklung umfasst normalerweise die Entwicklung einer Reihe unterstützender Klassen in einer separaten (Unit-testbaren) DLL. Diese Klasse (n) behandeln Geschäftslogik, Datenzugriff und Architektur- / Routingentscheidungen.

MVC

MVC betrachtet die Entwicklung von Webanwendungen eher als "architektonisch": Es bietet ein standardisiertes Gerüst, auf dem aufgebaut werden kann. Es bietet auch Tools zum automatischen Generieren von Modell-, Ansichts- und Controller-Klassen innerhalb der etablierten Architektur. Beispielsweise beginnen Sie sowohl in Ruby on Rails (ab jetzt nur noch "Rails") als auch in ASP.NET MVC immer mit einer Verzeichnisstruktur, die das Gesamtmodell der Webanwendungsarchitektur widerspiegelt. Um eine Ansicht, ein Modell und einen Controller hinzuzufügen, verwenden Sie einen Befehl wie Rails "Rails-Skript / Gerüst generieren {Modellname}" (ASP.NET MVC bietet ähnliche Befehle in der IDE). In der resultierenden Controller-Klasse gibt es Methoden ("Aktionen") für Index (Liste anzeigen), Anzeigen, Neu und Bearbeiten und Zerstören (zumindest in Rails ist MVC ähnlich). Standardmäßig sind diese "

Das Layout von Verzeichnissen und Dateien ist in MVC von Bedeutung. In ASP.NET MVC hat die Indexmethode für ein "Buch" -Objekt wahrscheinlich nur eine Zeile: "Return View ();" Durch die Magie von MVC wird das Buchmodell an die Seite "/View/Books/Index.aspx" gesendet, auf der Sie Code zum Anzeigen von Büchern finden. Rails Ansatz ist ähnlich, obwohl die Logik etwas expliziter und weniger "magisch" ist. Eine Ansichtsseite in einer MVC-App ist normalerweise einfacher als eine Web Forms-Seite, da sie sich nicht so sehr um Routing, Geschäftslogik oder Datenverarbeitung kümmern müssen.

Vergleich

Die Vorteile von MVC liegen in einer sauberen Trennung von Bedenken und einem saubereren, HTML / CSS / AJAX / Javascript-zentrierten Modell für die Erstellung Ihrer Ausgabe. Dies verbessert die Testbarkeit, bietet ein standardisierteres Design und öffnet die Tür zu einer Website vom Typ "Web 2.0".

Es gibt jedoch auch einige signifikante Nachteile.

Erstens, während es einfach ist, eine Demo-Site in Betrieb zu nehmen, weist das gesamte Architekturmodell eine signifikante Lernkurve auf. Wenn sie "Konvention über Konfiguration" sagen, klingt das gut - bis Sie feststellen, dass Sie eine Konvention im Wert von einem Buch lernen müssen. Darüber hinaus ist es oft ein wenig aufreizend , um herauszufinden , was los ist, weil Sie sind auf Magie anstatt explizite Anrufe zu verlassen. Zum Beispiel, dass "Return View ();" oben anrufen? Der exakt gleiche Aufruf kann in anderen Aktionen gefunden werden, aber sie gehen an verschiedene Orte. Wenn Sie die MVC-Konvention verstehendann wissen Sie, warum dies getan wird. Es ist jedoch sicherlich kein Beispiel für eine gute Benennung oder leicht verständlichen Code, und es ist für neue Entwickler viel schwieriger zu erlernen als Web Forms (dies ist nicht nur eine Meinung: Ich hatte letztes Jahr einen Sommerpraktikanten, der Web Forms lernte und MVC in diesem Jahr und die Unterschiede in der Produktivität waren ausgeprägt - zugunsten von Web Forms). Übrigens ist Rails in dieser Hinsicht etwas besser, obwohl Ruby on Rails dynamisch benannte Methoden bietet, an die man sich auch ernsthaft gewöhnen muss.

Zweitens geht MVC implizit davon aus, dass Sie eine klassische Website im CRUD-Stil erstellen. Die Architekturentscheidungen und insbesondere die Codegeneratoren sind alle darauf ausgelegt, diese Art von Webanwendung zu unterstützen. Wenn Sie eine CRUD-Anwendung erstellen und eine bewährte Architektur übernehmen möchten (oder Architekturdesign einfach nicht mögen), sollten Sie wahrscheinlich MVC in Betracht ziehen. Wenn Sie jedoch mehr als CRUD ausführen und / oder mit der Architektur einigermaßen kompetent sind, fühlt sich MVC möglicherweise wie eine Zwangsjacke an, bis Sie das zugrunde liegende Routing-Modell wirklich beherrschen (das erheblich komplexer ist als das einfache Routing in einer WebForms-App). Selbst dann hatte ich das Gefühl, immer gegen das Modell zu kämpfen und mir Sorgen um unerwartete Ergebnisse zu machen.

Drittens, wenn Sie sich nicht für Linq interessieren (entweder weil Sie befürchten, dass Linq-to-SQL verschwinden wird, oder weil Sie Linq-to-Entities lächerlich überproduziert und unterversorgt finden), dann wollen Sie es auch nicht Diesen Weg zu gehen, da ASP.NET MVC-Gerüstwerkzeuge um Linq herum gebaut wurden (dies war der Killer für mich). Das Datenmodell von Rails ist auch ziemlich umständlich im Vergleich zu dem, was Sie erreichen können, wenn Sie Erfahrung mit SQL haben (und insbesondere, wenn Sie mit TSQL und gespeicherten Prozeduren vertraut sind!).

Viertens weisen MVC-Befürworter häufig darauf hin, dass MVC-Ansichten dem HTML / CSS / AJAX-Modell des Webs näher kommen. Zum Beispiel sind "HTML-Helfer" - die kleinen Code-Aufrufe auf Ihrer vew-Seite, die Inhalte austauschen und in HTML-Steuerelemente einfügen - viel einfacher in Javascript zu integrieren als Web Forms-Steuerelemente. ASP.NET 4.0 bietet jedoch die Möglichkeit, Ihre Steuerelemente zu benennen, und beseitigt diesen Vorteil weitgehend.

Fünftens verspotten MVC-Puristen häufig Viewstate. In einigen Fällen haben sie Recht. Viewstate kann jedoch auch ein großartiges Werkzeug und ein Segen für die Produktivität sein. Zum Vergleich: Die Handhabung von Viewstate ist viel einfacher als der Versuch , Websteuerelemente von Drittanbietern in eine MVC-App zu integrieren. Während der Steuerung Integration für MVC bekommen kann einfacher, alle aktuellen Bemühungen , dass ich leidet unter der Notwendigkeit zu bauen gesehen habe (etwas grody) Code , der diese Kontrollen wieder auf die Ansicht der Controller - Klasse zu verknüpfen (das ist - zu Arbeit um das MVC - Modell ).

Schlussfolgerungen

Ich mag die MVC-Entwicklung in vielerlei Hinsicht (obwohl ich Rails bei weitem gegenüber ASP.NET MVC bevorzuge). Ich denke auch, dass es wichtig ist, dass wir nicht in die Falle tappen, dass ASP.NET MVC ein "Anti-Pattern" von ASP.NET Web Forms ist. Sie sind unterschiedlich, aber nicht völlig fremd und sicherlich gibt es Platz für beide.

Ich bevorzuge jedoch die Entwicklung von Web Forms, da es für die meisten Aufgaben einfach einfacher ist, Dinge zu erledigen (mit Ausnahme der Erstellung einer Reihe von CRUD-Formularen). MVC scheint in gewissem Maße auch unter einem Übermaß an Theorie zu leiden . Schauen Sie sich in der Tat die vielen Fragen an, die hier auf SO von Personen gestellt werden, die seitenorientiertes ASP.NET kennen, aber MVC ausprobieren. Ausnahmslos knirschen die Zähne, da Entwickler feststellen, dass sie keine grundlegenden Aufgaben erledigen können, ohne durch Reifen zu springen oder eine große Lernkurve zu überstehen. Dies ist es, was Web Forms in meinem Buch MVC überlegen macht: Mit MVC zahlen Sie einen realen Preis , um ein bisschen mehr Testbarkeit zu erlangen oder, noch schlimmer, einfach als cool angesehen zu werden, weil Sie das verwendenneueste Technik.

Update: Ich wurde im Kommentarbereich heftig kritisiert - einige davon sind ziemlich fair. Daher habe ich mehrere Monate damit verbracht, Rails und ASP.NET MVC zu lernen, um sicherzugehen, dass ich das nächste große Ding nicht wirklich verpasst habe! Natürlich trägt es auch dazu bei, dass ich eine ausgewogene und angemessene Antwort auf die Frage gebe. Sie sollten wissen, dass die obige Antwort eine wichtige Neufassung meiner ursprünglichen Antwort ist, falls die Kommentare nicht synchron zu sein scheinen.

Während ich mir MVC genauer ansah, dachte ich für eine Weile, dass ich am Ende einen großen Mea Culpa haben würde. Am Ende kam ich zu dem Schluss, dass MVC den Anruf für mich nicht wirklich beantwortet, obwohl ich denke, dass wir viel mehr Energie für die Architektur und Testbarkeit von Web Forms aufwenden müssen. Also ein herzliches Dankeschön an die Leute, die meine erste Antwort intelligent kritisiert haben.

Was diejenigen betrifft , die dies als religiösen Kampf betrachteten und unermüdlich Abstimmungsfluten verursachten, verstehe ich nicht, warum Sie sich die Mühe machen (mehr als 20 Abstimmungen innerhalb von Sekunden bei mehreren Gelegenheiten sind sicherlich nicht normal). Wenn Sie diese Antwort lesen und sich fragen, ob meine Antwort wirklich "falsch" ist, da die Punktzahl weitaus niedriger ist als einige der anderen Antworten, können Sie sicher sein, dass sie mehr über einige Leute aussagt, die anderer Meinung sind als der allgemeine Sinn von die Community (insgesamt wurde diese weit über 100 Mal positiv bewertet).

Tatsache ist, dass sich viele Entwickler nicht für MVC interessieren und dies in der Tat keine Minderheitensicht ist (selbst innerhalb von MS, wie die Blogs zu zeigen scheinen).

Mark Brittingham
quelle
32
-1, Die ursprüngliche Frage ist gut - zu sagen, dass Sie nicht verstehen, warum etwas gut ist, und nach weiteren Informationen zu fragen, ist fantastisch. Diese Antwort ist jedoch sehr seltsam - Sie sagen im Grunde "Ich verstehe auch nicht", wickeln sie aber in eine Geschichte ein.
Orip
49
Ich finde es interessant, dass Ihre Kritik an ASP.NET MVC darin besteht, dass es Abstraktion und Overhead hinzufügt. und ist daher komplizierter. Es ist genau das Gegenteil. Webforms fügt eine Abstraktionsebene hinzu und MVC ist viel einfacher und einfacher, was Sie nicht vor dem verbirgt, was Sie tun
Trevor de Koekkoek
75
Warum wird dies als "Die Antwort" markiert, wenn das Poster bei seiner Antwort nicht einmal etwas über das MVC-Muster wusste?
ScottKoon
12
ScottKoon - stimmte zu, nicht sicher, warum dies akzeptiert wurde. Alles, was er getan hat, war, dem OP zuzustimmen. -1
Jared
11
Ich habe Probleme mit Ihrer Charakterisierung von WebForms als besser zum Webparadigma passend. WebForms ist im Wesentlichen das ereignisgesteuerte WinForms-Modell, das dem Web überlagert ist. Als solches muss das Framework - und wir Entwickler, wenn wir, himmlisch, versuchen, etwas mit clientseitigen Nicht-MS-Tools zu tun - durch viele Rahmen springen, um so zu tun, als würden Sie die Ereignisbehandlung über das Web durchführen . MVC eignet sich sehr gut für RESTful-Schnittstellen, und REST versucht, die Webprotokolle so zu verwenden, wie sie vorgesehen sind. MS hat WebForms so entworfen, wie sie es getan haben, nicht weil es am besten für das Web geeignet ist
tvanfosson
117

Mit MVC haben Sie mehr Kontrolle über Ihre Ausgabe, und mit dieser Kontrolle steigt das Risiko, schlecht gestaltetes HTML, Tag-Suppe usw. zu schreiben.

Gleichzeitig haben Sie einige neue Optionen, die Sie vorher nicht hatten ...

  1. Mehr Kontrolle über die Seite und die Elemente auf der Seite
  2. Weniger "Junk" in Ihrer Ausgabe, wie der ViewState oder übermäßig lange IDs für Elemente (verstehen Sie mich nicht falsch, ich mag den ViewState)
  3. Bessere Fähigkeit zur clientseitigen Programmierung mit Javascript (Web 2.0-Anwendungen jemand?)
  4. Nicht nur MVC, sondern JsonResult ist schlau ...

Das heißt nicht, dass Sie mit WebForms nichts davon tun können, aber MVC macht es einfacher.

Ich verwende WebForms immer noch, wenn ich schnell eine Webanwendung erstellen muss, da ich Serversteuerelemente usw. nutzen kann. WebForms verbirgt alle Details von Eingabe-Tags und Senden-Schaltflächen.

Sowohl WebForms als auch MVC können zu absolutem Müll führen, wenn Sie nachlässig sind. Wie immer führt eine sorgfältige Planung und ein durchdachtes Design zu einer hochwertigen Anwendung, unabhängig davon, ob es sich um MVC oder WebForms handelt.

[Aktualisieren]

Wenn es auch ein Trost ist, ist MVC nur eine neue, sich weiterentwickelnde Technologie von Microsoft. Es gab viele Postings, bei denen WebForms nicht nur bleiben, sondern weiterentwickelt werden für ...

http://haacked.com

http://www.misfitgeek.com

http://rachelappel.com

... und so weiter...

Für diejenigen, die sich Sorgen über den Weg machen, den MVC nimmt, würde ich vorschlagen, "den Jungs" Ihr Feedback zu geben. Sie scheinen bisher zuzuhören!

Hugoware
quelle
10
Ich denke, die Punkte 1 und 2 sind der springende Punkt. Webforms als Abstraktion "funktionieren" meiner Meinung nach einfach nicht wirklich, weil es keine Abstraktion ist, die gut auf das abbildet, was wirklich vor sich geht. Ich denke, ASP.NET MVC ist eine besser passende Abstraktion als Webformulare, da ich nur begrenzte Erfahrungen mit MVC habe.
Daniel Auger
3
Viele Benutzer verwenden ASP.Net, ohne MVC oder Webforms zu berühren. Ich habe viele .NET-Anwendungen gesehen, die das Webforms-Modell vollständig umgehen und einfach alles im Code hinter der Seite tun. Und ehrlich gesagt denke ich, dass es besser funktioniert.
Kibbee
Danke für das Update HBoss! Ich würde es hassen, wenn MS WebForms nach 7 Jahren Arbeit aufgeben würde.
Mark Brittingham
1
Daniel - Sie sagen, Webforms "funktioniert" nicht, weil es dem Webmodell nicht gut zugeordnet werden kann. Ich bin mit Respekt anderer Meinung: http entstand als Modell für das Abrufen von Dokumenten . Die Webforms-Architektur erweitert lediglich die Idee von Dokumenten, sodass diese dynamisch sind. Das funktioniert bei mir ...
Mark Brittingham
3
@ Mdbritt. Ich respektiere Ihre Meinung, weil dies auf einer hohen Abstraktionsebene (Abrufen eines Dokuments) zutrifft. Für mich ist das Pseudo-Statefulness- und Postback-Modell jedoch der Ort, an dem es zusammenbricht, insbesondere in hochdynamischen Szenarien. Es funktioniert gut für einfache Dinge, aber es löst sich schnell.
Daniel Auger
76

Die meisten Einwände gegen ASP.NET MVC scheinen sich auf die Ansichten zu konzentrieren, die eines der "optionalsten" und modularsten Bits in der Architektur sind. NVelocity , NHaml , Funken , XSLT und andere Ansicht Motoren können leicht ausgelagert (und es wurde mit jeder neuen Version immer einfacher). Viele von ihnen haben VIEL präzisere Syntax für Präsentationslogik und Formatierung, während sie dennoch die vollständige Kontrolle über das ausgegebene HTML geben.

Darüber hinaus scheint fast jede Kritik auf das <%%> -Tagging in den Standardansichten zurückzuführen zu sein und darauf, wie "hässlich" es ist. Diese Meinung wurzelt häufig in der Verwendung des WebForms-Ansatzes, der nur den größten Teil der klassischen ASP-Hässlichkeit in die CodeBehind-Datei verschiebt.

Auch ohne Code-Behinds "falsch" zu machen, gibt es Dinge wie OnItemDataBound in Repeatern, die genauso ästhetisch hässlich sind, wenn auch nur auf andere Weise, als "Tag-Suppe". Eine foreach-Schleife kann viel einfacher zu lesen sein, selbst wenn Variablen in die Ausgabe dieser Schleife eingebettet sind, insbesondere wenn Sie von anderen Nicht-ASP.NET-Technologien zu MVC kommen. Google-fu benötigt viel weniger, um die foreach-Schleife zu verstehen, als herauszufinden, dass die Möglichkeit, dieses eine Feld in Ihrem Repeater zu ändern, darin besteht, sich mit OnItemDataBound (und dem Nest der Ratte, zu prüfen, ob es das richtige Element ist, das geändert werden soll) zu messen.

Das größte Problem bei ASP-Tag-Suppe-gesteuerten "Spaghetti" bestand eher darin, Dinge wie Datenbankverbindungen direkt zwischen den HTML-Code zu schieben.

Dass dies zufällig mit <%%> geschehen ist, ist nur eine Korrelation mit der Spaghetti-Natur des klassischen ASP, nicht mit der Ursache. Wenn Sie Ihre Ansichtslogik auf HTML / CSS / Javascript und die für die Präsentation erforderliche minimale Logik beibehalten , ist der Rest die Syntax.

Stellen Sie beim Vergleich eines bestimmten Funktionsumfangs mit WebForms sicher, dass alle vom Designer generierten C # und das Code-Behind-C # zusammen mit dem ASPX-Code enthalten sind, um sicherzustellen, dass die MVC-Lösung tatsächlich nicht viel einfacher ist .

In Kombination mit der vernünftigen Verwendung von Teilansichten für wiederholbare Teile der Präsentationslogik kann dies wirklich schön und elegant sein.

Persönlich wünsche ich mir, dass sich ein Großteil der frühen Inhalte des Tutorials mehr auf dieses Ende der Dinge konzentriert als fast ausschließlich auf das Testen, die Umkehrung der Kontrolle usw. Während die Experten gegen diese anderen Dinge Einwände erheben, sind die Leute in den Gräben wahrscheinlicher Einwände gegen die "Tag Suppe".

Unabhängig davon ist dies eine Plattform, die sich noch in der Beta befindet. Trotzdem werden immer mehr Bereitstellungs- und Nicht-Microsoft-Entwickler damit arbeiten als mit den meisten Microsoft-Beta-Technologien. Aus diesem Grund scheint es so, als ob es weiter fortgeschritten ist als die Infrastruktur (Dokumentation, Leitmuster usw.). Wenn es an dieser Stelle wirklich verwendbar ist, wird dieser Effekt nur noch verstärkt.

J Wynia
quelle
1
Ich wusste nicht, dass Sie andere View-Engines problemlos austauschen können. Können Sie weitere Informationen dazu bereitstellen?
RedFilter
Ich habe keinen Link zur Hand, aber Phil Haack hat vor ein paar Wochen auf seiner Website einen Artikel veröffentlicht, der zeigt, wie man sie sogar nebeneinander ausführen kann.
J Wynia
1
Amen! Ich hasse es, Findcontrol zu benutzen. Ich hasse es so sehr.
Adam Lassek
3
Hervorragender, gut abgerundeter Pfosten.
Owen
59
<% if (Model.PreviousPost || Model.NextPost) { %>
    <div class="pager">
        <% if (Model.PreviousPost) { %>
            <span><% Html.ActionLink("<< " + Model.PreviousPost.Subject, "view")); %></span>
        <% } if (Model.NextPost) { %>
            <span><% Html.ActionLink(Model.NextPost.Subject + " >>", "view")); %></span>
        <% } %>
    </div>
<% } %>

Sie können einen weiteren Beitrag verfassen, in dem Sie gefragt werden, wie dies ohne das eingebettete CSS geschehen soll.

HINWEIS: ViewData.Model wird in der nächsten Version zum Modell.

Und mit Hilfe einer Benutzersteuerung würde dies werden

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

Dabei wird PagerData über einen anonymen Konstruktor im Aktionshandler initialisiert.

edit: Ich bin gespannt, wie Ihre WebForm-Implementierung für dieses Problem aussehen würde.

Todd Smith
quelle
4
Guter Post. Dem OP fehlen einige Techniken wie die Wiederverwendung über RenderPartial, die seinen Code sauberer machen würden. Zur Verteidigung des OP deutete er an, dass er das Gefühl hatte, etwas falsch zu machen.
Daniel Auger
25

Ich bin mir nicht sicher, an welchem ​​Punkt die Leute aufgehört haben, sich um ihren Code zu kümmern.

HTML ist die öffentlichste Darstellung Ihrer Arbeit. Es gibt viele Entwickler, die Notepad, Notepad ++ und andere Nur-Text-Editoren verwenden, um viele Websites zu erstellen.

Bei MVC geht es darum, die Kontrolle über Webformulare zurückzugewinnen, in einer zustandslosen Umgebung zu arbeiten und das Model View Controller-Entwurfsmuster zu implementieren, ohne die zusätzliche Arbeit, die normalerweise bei der Implementierung dieses Musters anfällt.

Wenn Sie Kontrolle haben, Code bereinigen und MVC-Entwurfsmuster verwenden möchten, ist dies das Richtige für Sie. Wenn Sie nicht gerne mit Markups arbeiten, sich nicht darum kümmern, wie fehlerhaft Ihr Markup wird, verwenden Sie ASP.Net Web Forms.

Wenn Sie auch nicht mögen, werden Sie definitiv genauso viel Arbeit im Markup erledigen.

BEARBEITEN I Sollte auch angegeben werden, dass Web Forms und MVC ihren Platz haben, habe ich in keiner Weise festgestellt, dass eines besser ist als das andere, nur dass jede MVC die Stärke hat, die Kontrolle über das Markup wiederzugewinnen.

Tom Anderson
quelle
6
Das ausgegebene Markup ist mir (bis zu einem gewissen Punkt) egal, ich kümmere mich um wartbaren Code. Der Kompromiss hier von Webforms ist es meiner Meinung nach nicht wert.
FlySwat
1
Ich hatte noch nie ein Problem mit guten Markups von Webforms. Sicher, Sie haben ein ViewState-Feld, aber wenn Sie mit Ihrem Design vorsichtig sind, erhalten Sie kein kaputtes HTML.
FlySwat
2
Wenn Sie einen 2-MB-Viewstate sehen, müssen Sie eine Menge Steuerelemente suchen, um ein Steuerelement in einem Webformular zu finden, da die tatsächlichen Elemente fehlerhaft benannt sind. Dies wird begrüßt. Ich war immer anal in Bezug auf meinen Code, jeder kann Source anzeigen, und ich habe OCD und möchte, dass mein Haus sauber ist.
Tom Anderson
5
Sie erhalten nur dann einen 2-MB-Ansichtsstatus, wenn Sie nicht wissen, was Sie tun.
FlySwat
3
Sie erhalten auch Tag-Suppe, wenn Sie nicht wissen, was Sie tun und Code zusammen werfen ...
Hugoware
15

Ich denke, Sie vermissen einige Dinge. Erstens ist die Antwort nicht erforderlich. Schreiben Sie, Sie können die <%= %>Tags verwenden. Zweitens können Sie Ihre eigenen HtmlHelper-Erweiterungen schreiben, um allgemeine Aktionen auszuführen. Drittens hilft ein bisschen Formatierung sehr. Viertens würde all dies wahrscheinlich in einem Benutzersteuerelement stecken bleiben, das von mehreren verschiedenen Ansichten gemeinsam genutzt wird, und somit ist die Gesamtbewertung in der Hauptansicht sauberer.

Ich gebe Ihnen zu, dass das Markup immer noch nicht so ordentlich ist, wie man es gerne hätte, aber es könnte durch die Verwendung einiger temporärer Variablen erheblich bereinigt werden.

Nun, das ist nicht so schlimm und es wäre noch besser, wenn ich es nicht für SO formatieren müsste.

 <%
    var PreviousPost = ViewData.Model.PreviousPost;
    var NextPost = ViewData.Model.NextPost;

    // Display the "Next and Previous" links
    if (PreviousPost != null || NextPost != null)
    {
  %>

 <div>

        <%= PreviousPost == null
                ? string.Empty
                : Html.ActionLinkSpan("<< " + PreviousPost.Subject,
                                "view",
                                new { id = PreviousPost.Id },
                                new { style = "float: left;" } ) %>
          <%= NextPost == null
                ? string.Empty
                : Html.ActionLinkSpan( NextPost.Subject + " >>",
                                   "view",
                                    new { id = NextPost.Id },
                                    new { style = "float: right;" } ) %>

  <div style="clear: both;" />
  </div>

  <% } %>
Tvanfosson
quelle
2
Scheint es nicht immer noch so seltsam, wenn man bedenkt, dass ich die Sichtbarkeit eines <asp: hyperlink> in Webforms hätte einstellen können?
FlySwat
2
Nein, denn selbst Webformulare wären nicht so einfach. Sie müssten wahrscheinlich einige Eigenschaften für den Hyperlink im Codebehind festlegen, da diese dynamisch sind. Sie benötigen weiterhin den DIV / span-Code, können ihn jedoch nicht in eine Methode umwandeln. Und nichts davon wäre überprüfbar.
Tvanfosson
3
Ich habe genug Webformulare erstellt, dass mich der Schmerz, mit datengebundenen Steuerelementen umzugehen und sie dazu zu bringen, das zu tun, was ich auf der Clientseite tun möchte, zusammen mit der Möglichkeit, die Menge des getesteten Codes mindestens um das Zweifache zu erhöhen, überzeugt hat. Ich habe auch genug in Rails getan, dass dies überhaupt nicht seltsam erscheint.
Tvanfosson
1
Ich müsste NavigateUrl und Visibility einstellen. Das Ereignis page_load besteht aus 2 Zeilen.
FlySwat
2
Ich denke, es ist die Tatsache, dass Sie dies in Schienen getan haben. Das letzte Mal, als ich das tat, war klassischer ASP, der viele andere Gründe hat, ihn zu hassen. Vielleicht muss ich nur meine anfängliche Würgereflexabneigung gegen <%%> Tags überwinden.
FlySwat
14

Die große Sache mit MVC ist, dass es sich um ein seit langem bestehendes konzeptionelles Framework handelt, das sich als produktive und leistungsstarke Methode zum Erstellen von Webanwendungen und Workstation-Anwendungen erwiesen hat, die horizontal und vertikal skaliert werden können. Es geht direkt zurück zum Alto und Smalltalk. Microsoft kommt zu spät zur Party. Was wir jetzt mit ASP.NET MVC haben, ist wirklich primitiv, weil es so viel Nachholbedarf gibt; aber verdammt, sie gießen Neuerscheinungen schnell und wütend aus.

Was war die große Sache mit Ruby on Rails? Rails ist MVC. Entwickler haben konvertiert, weil es durch Mundpropaganda für Programmierer zum Weg geworden ist, produktiv zu sein.

Es ist eine große Sache; MVC und die implizite Unterstützung von jQuery sind Wendepunkte für Microsoft, die akzeptieren, dass plattformneutral von entscheidender Bedeutung ist. Und das Neutrale daran ist, dass Microsoft Sie im Gegensatz zu Web Forms nicht konzeptionell einbinden kann. Sie können Ihren gesamten C # -Code vollständig in einer anderen Sprache implementieren (z. B. PHP oder Java - Sie nennen es), da das MVC-Konzept portabel ist und nicht der Code selbst. (Und denken Sie daran, wie groß es ist, dass Sie Ihr Design als Workstation-App mit nur geringen Codeänderungen und ohne Designänderungen implementieren können. Versuchen Sie dies mit Web Forms.)

Microsoft hat entschieden, dass Web Forms nicht das nächste VB6 sein wird.

dkretz
quelle
1
Hinzu kommt, dass eine Reihe von View-Engines verfügbar sind, die an MVC angeschlossen werden, darunter die Standard-WebForms sowie ein Port von RoRs HAML (der spitze Klammern verbietet, insbesondere wenn sie Prozentzeichen enthalten).
Yfeldblum
Interessante Art, es
auszudrücken
HAML FTW, besonders wenn Ihr einziger Einwand gegen MVC die <
%%
9

Die beiden Hauptvorteile des ASP.NET MVC-Frameworks gegenüber Webformularen sind:

  1. Testbarkeit - Die Benutzeroberfläche und Ereignisse in Webformularen können kaum getestet werden. Mit ASP.NET MVC ist es einfach, Controller-Aktionen und die von ihnen gerenderten Ansichten zu testen. Dies ist mit Kosten für die Vorabentwicklung verbunden. Studien haben jedoch gezeigt, dass sich dies langfristig auszahlt, wenn es darum geht, die App zu überarbeiten und zu warten.
  2. Bessere Kontrolle über gerendertes HTML - Sie geben an, dass Sie sich nicht für das gerenderte HTML interessieren, weil niemand darauf schaut. Dies ist eine gültige Beschwerde, wenn dies der einzige Grund war, HTML ordnungsgemäß formatiert zu haben. Es gibt zahlreiche Gründe, warum richtig formatiertes HTML gewünscht wird, darunter: SEO, die Möglichkeit, ID-Selektoren häufiger zu verwenden (in CSS und Javascript), kleinere Seitenabdrücke aufgrund fehlenden Ansichtsstatus und lächerlich lange IDs (ctl00_etcetcetc).

Diese Gründe machen ASP.NET MVC nicht wirklich besser oder schlechter als Webformulare in Schwarzweiß. ASP.NET MVC hat seine Stärken und Schwächen, genau wie Webformulare. Die meisten Beschwerden über ASP.NET MVC scheinen jedoch auf mangelndes Verständnis der Verwendung zurückzuführen zu sein, anstatt auf tatsächlichen Fehlern im Framework. Der Grund, warum sich Ihr Code nicht richtig anfühlt oder nicht richtig aussieht, könnte sein, dass Sie über mehrjährige Erfahrung mit Webformularen und nur 1-2 Monate Erfahrung mit ASP.NET MVC verfügen.

Das Problem hier ist nicht so sehr, dass ASP.NET MVC rockt oder nervt, sondern dass es neu ist und es kaum Übereinstimmung darüber gibt, wie man es richtig verwendet. ASP.NET MVC bietet eine genauere Kontrolle darüber, was in Ihrer App geschieht. Dies kann bestimmte Aufgaben einfacher oder schwieriger machen, je nachdem, wie Sie sie angehen.

Kevin Pang
quelle
8

Hey, ich habe auch Probleme damit, zu MVC zu wechseln. Ich bin absolut kein Fan von klassischem ASP- und MVC-Rendering, das mich sehr an diese Tage erinnert. Je öfter ich MVC benutze, desto mehr wächst es auf mir. Ich bin ein Webform-Typ (wie viele) und habe mich in den letzten Jahren daran gewöhnt, mit Datagrids usw. zu arbeiten. Mit MVC wird das weggenommen. HTML Helper Klassen sind die Antwort.

Erst kürzlich habe ich zwei Tage lang versucht, herauszufinden, wie Paging einem "Grid" in MVC am besten hinzugefügt werden kann. Mit Webformularen konnte ich dies in kürzester Zeit herauspeitschen. Aber ich werde das sagen ... Nachdem ich die Paging-Hilfsklassen für MVC erstellt hatte, war die Implementierung extrem einfach. Für mich noch einfacher als Webformulare.

Abgesehen davon denke ich, dass MVC viel entwicklerfreundlicher sein wird, wenn es eine konsistente Reihe von HTML-Helfern gibt. Ich denke, wir werden in naher Zukunft eine Menge HTML-Hilfsklassen im Web sehen.

Papa Burgund
quelle
Ich würde gerne Ihre Paging-Implementierung sehen, da ich noch keine Ahnung habe, wie ich das angehen soll :)
dtc
Hierher habe ich die Paging-Helfer. Sie können das Beispielprojekt hier herunterladen: blogs.taiga.nl/martijn/archive/2008/08/27/…
Papa Burgundy
Wie bei allem gibt es eine Lernkurve. Sie werden vielleicht angenehm überrascht sein, wie viel besser die Arbeit in bestimmten Bereichen ist. Ich werde jedoch nicht lügen - einige der Luxusgüter wie Server Controls und ViewState werden sicherlich vermisst. Ich habe <asp: TextB eingegeben ... und dann festgestellt ... Whoops !!
Hugoware
Hier ist eine ehrliche Frage. Wenn Sie HTML "Helper" -Klassen benötigen, haben Sie das MVC-Modell nicht wirklich verletzt? Lassen Sie nicht die Einfachheit und Eleganz hinter sich, mit der es verkauft wird? Wenn ich falsch liege (und vielleicht auch!), Sag mir bitte warum.
Mark Brittingham
1
Ich denke nicht, dass Sie zu MVC "wechseln" müssen. Ich benutze immer noch WebForms je nach Projekt.
Hugoware
8

Es ist lustig, weil ich das gesagt habe, als ich zum ersten Mal Webformulare gesehen habe.

greg
quelle
Im Ernst , das war es wirklich. WebForms macht wenig Sinn, ohne den Kontext der Zeiten zu kennen, die es uns gebracht haben. Es umfasst das Web nicht, sondern versucht es zu verbergen, und es ist eine sehr schlechte Abstraktion.
Jason Bunting
6

Ich gebe zu, dass ich asp.net MVC noch nicht bekomme. Ich versuche es in einem Nebenprojekt zu verwenden, aber es geht ziemlich langsam voran.

Abgesehen davon, dass ich nicht in der Lage bin, Dinge zu tun, die in Webformularen so einfach zu tun waren, bemerke ich die Tag-Suppe. Aus dieser Perspektive scheint es wirklich einen Schritt zurück zu machen. Ich hoffe immer wieder, dass es besser wird, wenn ich lerne.

Bisher ist mir aufgefallen, dass der Hauptgrund für die Verwendung von MVC darin besteht, die volle Kontrolle über Ihr HTML zu erlangen. Ich habe auch gelesen, dass asp.net MVC in der Lage ist, mehr Seiten schneller als Webformulare bereitzustellen, und wahrscheinlich ist die individuelle Seitengröße damit kleiner als eine durchschnittliche Webformularseite.

Es ist mir wirklich egal, wie mein HTML aussieht, solange es in den gängigen Browsern funktioniert, aber es ist mir egal, wie schnell meine Seiten geladen werden und wie viel Bandbreite sie beanspruchen.

dtc
quelle
6

Obwohl ich voll und ganz zustimme, dass dies ein hässliches Markup ist, halte ich es nicht für fair, die hässliche Ansichtssyntax zum Abschreiben von ASP.NET MVC als Ganzes zu verwenden. Die Ansichtssyntax hat die geringste Aufmerksamkeit von Microsoft erhalten, und ich erwarte voll und ganz, dass bald etwas dagegen unternommen wird.

In anderen Antworten wurden die Vorteile von MVC als Ganzes erörtert, daher werde ich mich auf die Ansichtssyntax konzentrieren:

Die Ermutigung, Html.ActionLink und andere Methoden zu verwenden, die HTML generieren, ist ein Schritt in die falsche Richtung. Dies riecht nach Serversteuerung und löst für mich ein Problem, das es nicht gibt. Wenn wir Tags aus Code generieren wollen, warum dann überhaupt HTML verwenden? Wir können einfach DOM oder ein anderes Modell verwenden und unsere Inhalte im Controller aufbauen. Ok, das hört sich schlecht an, nicht wahr? Oh ja, Trennung von Bedenken, deshalb haben wir eine Ansicht.

Ich denke, die richtige Richtung ist, die Ansichtssyntax so ähnlich wie HTML zu gestalten. Denken Sie daran, dass eine gut gestaltete MVC nicht nur die Trennung von Code und Inhalt ermöglicht, sondern auch die Optimierung Ihrer Produktion ermöglicht, indem Experten, die sich mit Layout auskennen, die Ansichten bearbeiten (auch wenn sie ASP.NET nicht kennen) Später als Entwickler können Sie einspringen und das Ansichtsmodell tatsächlich dynamisch gestalten. Dies ist nur möglich, wenn die Ansichtssyntax HTML sehr ähnlich sieht, sodass die Layouter DreamWeaver oder das derzeit beliebte Layout-Tool verwenden können. Möglicherweise bauen Sie Dutzende von Standorten gleichzeitig und müssen auf diese Weise skalieren, um die Produktionseffizienz zu steigern. Lassen Sie mich ein Beispiel geben, wie ich die Ansicht "Sprache" sehen konnte:

<span mvc:if="ViewData.Model.ShowPrevious" style="float: left;">
    <a mvc:inner="ViewData.Model.PreviousPost.Subject" href="view/{ViewData.Model.PreviousPost.Id}">sample previous subject</a>
</span> 
<span mvc:if="ViewData.Model.ShowNext" style="float: left;">
    <a mvc:inner="ViewData.Model.NextPost.Subject" href="view/{ViewData.Model.NextPost.Id}">sample next subject</a>
</span> 
<div mvc:if="ViewData.Model.ShowNextOrPrevious" style="clear: both;" />

Dies hat mehrere Vorteile:

  • sieht besser aus
  • prägnanter
  • Kein funky Kontextwechsel zwischen HTML- und <%%> -Tags
  • leicht verständliche Schlüsselwörter, die selbsterklärend sind (selbst ein Nicht-Programmierer könnte dies tun - gut für die Parallelisierung)
  • Es wurde so viel Logik wie möglich in den Controller (oder das Modell) zurückgeführt
  • Kein generiertes HTML - auch dies macht es für jemanden sehr einfach, hereinzukommen und zu wissen, wo etwas zu stylen ist, ohne mit HTML herumspielen zu müssen. Methoden
  • Der Code enthält Beispieltext, der beim Laden der Ansicht als einfaches HTML in einem Browser gerendert wird (wiederum gut für Layouter).

Was genau macht diese Syntax?

mvc: inner = "" - was auch immer in den Anführungszeichen steht, wird ausgewertet und der innere HTML-Code des Tags wird durch die resultierende Zeichenfolge ersetzt. (Unser Beispieltext wird ersetzt)

mvc: äußere = "" - was auch immer in den Anführungszeichen steht, wird ausgewertet und der äußere HTML-Code des Tags wird durch die resultierende Zeichenfolge ersetzt. (Wieder wird der Beispieltext ersetzt.)

{} - Dies wird zum Einfügen einer Ausgabe in Attribute verwendet, ähnlich wie bei <% =%>

mvc: if = "" - insde the qoutes ist der zu evakuierende boolesche Ausdruck. Am Ende des if wird das HTML-Tag geschlossen.

mvc: sonst

mcv: elseif = "" - ...

mvc: foreach

RedFilter
quelle
1
Sie können ziemlich einfach genau das implementieren, was Sie als Ihre eigene Ansichts-Engine beschreiben, und die WebForms-Lösung vollständig weglassen.
J Wynia
1
Ich wollte eine Notiz machen, dass es andere View-Engines gibt und dass ein Markup im cf-Stil gut funktionieren würde, was Sie hier zeigen.
Tracker1
Vielen Dank für die Info, war nicht bewusst, dass es andere View-Engines gab.
RedFilter
Genshi ist eine beliebte Python-Template-Engine mit einem ähnlichen Ansatz. Weitere Inspirationen finden Sie hier: genshi.edgewall.org/wiki/…
orip
Aber niemand mochte XSLs. Wie erwarten Sie, dass dies übernommen wird?
BobbyShaftoe
4

Jetzt kann ich hier nur für mich selbst sprechen:

IMO, wenn Sie ein eingefleischter (irgendetwas) sind, dann ist die Konvertierung nichts für Sie. Wenn Sie WebForms lieben, liegt das daran, dass Sie das erreichen können, was Sie brauchen, und das ist auch das Ziel eines jeden.

Webforms abstrahiert HTML gut vom Entwickler . Wenn dies Ihr Ziel ist, bleiben Sie bei Web Forms. Sie haben all die wundervollen "Click and Drag" -Funktionen, die die Desktop-Entwicklung zu dem gemacht haben, was sie heute ist. Es gibt viele enthaltene Steuerelemente (plus eine Vielzahl von Steuerelementen von Drittanbietern), die unterschiedliche Funktionen hervorbringen können. Sie können ein "Raster", das direkt mit einer DataSource verknüpft ist, aus Ihrer Datenbank ziehen. Es wird mit integrierter Inline-Bearbeitung, Paging usw. geliefert.

Derzeit ist ASP.NET MVC in Bezug auf Steuerelemente von Drittanbietern sehr eingeschränkt. Wenn Sie also Rapid Application Development mögen, bei dem viele Funktionen für Sie verkabelt sind, sollten Sie nicht versuchen, sich konvertieren zu lassen.

Nach alledem leuchtet hier ASP.NET: - TDD. Code ist nicht testbar, sagte Nuff.

  • Trennung von Bedenken. Das ist das Rückgrat des MVC-Musters. Mir ist völlig bewusst, dass Sie dies in Web Forms erreichen können. Ich mag jedoch auferlegte Struktur. In Web Forms war es zu einfach, Design und Logik zu mischen. ASP.NET MVC erleichtert es verschiedenen Teammitgliedern, an verschiedenen Abschnitten der Anwendung zu arbeiten.

  • Ich komme von woanders her: Mein Hintergrund ist CakePHP und Ruby on Rails. Es ist also klar, wo meine Vorurteile liegen. Es geht einfach darum, womit Sie sich wohl fühlen.

  • Lernkurve: Um den letzten Punkt zu erweitern; Ich hasste die Idee des "Templating", um die Funktionalität verschiedener Elemente zu ändern. Mir hat die Tatsache nicht gefallen, dass ein Großteil des Designs im Code hinter der Datei ausgeführt wurde. Es war noch eine Sache zu lernen, als ich bereits mit HTML und CSS vertraut war. Wenn ich etwas in einem "Element" auf der Seite tun möchte, stecke ich ein "div" oder "span" ein, klopfe eine ID darauf und los geht's. In Web Forms müsste ich nachforschen, wie das geht.

  • Aktueller Stand des Web "Design": Javascript-Bibliotheken wie jQuery werden immer häufiger. Die Art und Weise, wie Web Forms Ihre IDs beschädigt, erschwert lediglich die Implementierung (außerhalb von Visual Studio).

  • Mehr Trennung (Design): Da ein Großteil des Designs in Ihre Steuerelemente eingebunden ist, ist es für einen externen Designer (ohne Web Forms) sehr schwierig, an einem Web Forms-Projekt zu arbeiten. Web Forms wurde entwickelt, um das Ende aller und alle zu sein.

Viele dieser Gründe sind wiederum auf meine Unkenntnis von Web Forms zurückzuführen. Ein Web Forms-Projekt (sofern richtig entworfen) kann "die meisten" Vorteile von ASP.NET MVC bieten. Aber das ist die Einschränkung: "Wenn richtig entworfen". Und das ist nur etwas, was ich in Web Forms nicht kann.

Wenn Sie in Web Forms hervorragende Arbeit leisten, sind Sie effizient und es funktioniert für Sie. Dort sollten Sie bleiben.

Machen Sie im Grunde genommen einen kurzen Überblick über beide (versuchen Sie, eine unvoreingenommene Quelle zu finden [viel Glück]) mit einer Liste von Vor- und Nachteilen, bewerten Sie, welche zu Ihren Zielen passt, und wählen Sie basierend darauf aus.

Unter dem Strich wählen Sie den Weg des geringsten Widerstands und des größten Nutzens, um Ihre Ziele zu erreichen. Web Forms ist ein sehr ausgereiftes Framework und wird in Zukunft nur noch besser. ASP.NET MVC ist einfach eine weitere Alternative (um Ruby on Rails- und CakePHP-Entwickler wie mich einzubeziehen: P)

Kevin
quelle
3

Die JSPs von Java EE sahen so aus, als sie zum ersten Mal vorgeschlagen wurden - hässlicher Scriptlet-Code.

Dann boten sie Tag-Bibliotheken an, um sie mehr HTML-tag-ish zu machen. Das Problem war, dass jeder eine Tag-Bibliothek schreiben konnte. Einige der Ergebnisse waren katastrophal, da die Leute viel Logik (und sogar Stil) in Tag-Bibliotheken eingebettet haben, die HTML generiert haben.

Ich denke, die beste Lösung ist die JSP Standard Tag Library (JSTL). Es ist "Standard", HTML-Tag-ish und hilft zu verhindern, dass Leute Logik in Seiten einfügen.

Ein zusätzlicher Vorteil besteht darin, dass diese Abgrenzungslinie zwischen Webdesignern und Entwicklern erhalten bleibt. Die guten Websites, die ich sehe, wurden von Menschen mit einem ästhetischen Sinn und Design für Benutzerfreundlichkeit entworfen. Sie legen Seiten und CSS an und geben sie an Entwickler weiter, die die dynamischen Datenbits hinzufügen. Als Entwickler, dem diese Gaben fehlen, geben wir meiner Meinung nach etwas Wichtiges preis, wenn wir Entwickler bitten, Webseiten von Suppe bis Nuss zu schreiben. Flex und Silverlight leiden unter demselben Problem, da es unwahrscheinlich ist, dass Designer JavaScript und AJAX gut kennen.

Wenn .NET einen ähnlichen Pfad wie JSTL hätte, würde ich empfehlen, dass sie sich damit befassen.

Duffymo
quelle
+1 - mehr, wenn ich es geben könnte. Ja ... Java ist schon lange auf diesem Weg. Der seltsame Teil ist, dass Java auch einige MVC-Frameworks gesehen hat, die auch Komponenten anschrauben - wie JSF und Tapestry. MVC ist meiner Meinung nach die einzig vernünftige Architektur für eine Webanwendung. Ich würde nicht zulassen, dass Rindfleisch mit dem Framework Sie daran hindert, ein tieferes Verständnis davon zu bekommen. Das Framework wird sich weiterentwickeln.
cwash
3

Ich dachte nur, ich würde das Aussehen dieses Beispiels mit der glänzenden neuen Razor View Engine teilen, die seit ASP .NET MVC 3 Standard ist.

@{ 
    var prevPost = ViewData.Model.PreviousPost;
    var nextPost = ViewData.Model.NextPost;
}

@if (prevPost != null || nextPost != null) {
    <div>
        @if (prevPost != null) {
            <span style="float: left;">
                @Html.ActionLink("<< " + prevPost.Subject, "view", new { id = prevPost.Id })
            </span>
        }
        @if (nextPost != null) {
            <span style="float: left;">
                @Html.ActionLink(nextPost.Subject + " >>", "view", new { id = nextPost.Id })
            </span>
        }
        <div style="clear: both;" />
    </div>
}

Irgendein Problem damit?
Außerdem sollten Sie Ihre CSS-Stile eigentlich nicht einbinden, oder? Und warum prüfen Sie an drei Stellen statt nur an zwei Stellen die Nichtigkeit? Ein Extra divtut selten weh. So würde ich es machen:

<div>
    @if (prevPost != null) {
        @Html.ActionLink("<< " + prevPost.Subject, "view",
            new { id = prevPost.Id, @class = "prev-link" })
    }
    @if (nextPost != null) {
        @Html.ActionLink(nextPost.Subject + " >>", "view",
            new { id = nextPost.Id, @class = "next-link" })
    }
    <div class="clear" />
</div>
Dan Abramov
quelle
2

Ich kann nicht direkt mit dem ASP.NET MVC-Projekt sprechen, aber im Allgemeinen dominieren MVC-Frameworks die Entwicklung von Webanwendungen, weil

  1. Sie bieten eine formale Trennung zwischen Datenbankbetrieb, "Geschäftslogik" und Präsentation

  2. Sie bieten genügend Flexibilität in der Ansicht, damit Entwickler ihr HTML / CSS / Javascript so optimieren können, dass es in mehreren Browsern und zukünftigen Versionen dieser Browser funktioniert

Es ist das letzte Stück, das wichtig ist. Mit Webforms und ähnlichen Technologien verlassen Sie sich darauf, dass Ihr Anbieter Ihr HTML / CSS / Javascript für Sie schreibt. Es ist mächtig, aber Sie können nicht garantieren, dass die aktuelle Version von Webforms mit der nächsten Generation von Webbrowsern funktioniert.

Das ist die Kraft der Aussicht. Sie erhalten die volle Kontrolle über den HTML-Code Ihrer Anwendung. Der Nachteil ist, dass Sie diszipliniert genug sein müssen, um die Logik in Ihren Ansichten auf ein Minimum zu beschränken und den Vorlagencode so einfach wie möglich zu halten.

Das ist also der Kompromiss. Wenn Webforms für Sie funktionieren und MVC nicht, verwenden Sie weiterhin Webforms

Alan Storm
quelle
1
"Sie verlassen sich darauf, dass Ihr Anbieter Ihr HTML / CSS / Javascript für Sie schreibt" Das ist Unsinn. Verwendet jeder die vorgefertigten Steuerelemente? Wir haben nie.
FlySwat
1
Punkt 1 ist auch Unsinn. Jede App, die ich erstellt habe, wurde stark voneinander getrennt, wobei nur der Code dahinter die Bindungslogik für die Ansicht ist. Die Ereignishandler im Codebehind haben einfach die entsprechenden Methoden in der Geschäftsschicht aufgerufen.
FlySwat
1
Wie ich schon sagte, Jon, wenn Webforms für Sie arbeitet und Ihr Shop die Zeit hat, eigene Steuerelemente zu entwickeln, dann machen Sie weiter.
Alan Storm
1
@FlySwat - Sie haben NIE eine DropDownList oder DataGrid verwendet?
Simon_Weaver
2

Der größte Teil meiner Frustration besteht darin, nicht zu wissen, wie man Dinge "richtig" macht. Seit es als Vorschau veröffentlicht wurde, hatten wir alle ein bisschen Zeit, uns die Dinge anzuschauen, aber sie haben sich ziemlich verändert. Anfangs war ich sehr frustriert, aber das Framework scheint so funktionsfähig zu sein, dass ich ziemlich schnell extrem komplexe Benutzeroberflächen (sprich: Javascript) erstellen kann. Ich verstehe, dass Sie dies mit Webforms tun können, wie ich es zuvor getan habe, aber es war ein großer Schmerz im Hintern, alles richtig zu rendern. Oft habe ich einen Repeater verwendet, um die genaue Ausgabe zu steuern, und am Ende habe ich auch viel Spaghetti-Chaos, das Sie oben haben.

In dem Bestreben, nicht das gleiche Durcheinander zu haben, habe ich eine Kombination aus Domain, Service-Layern und einem Dto verwendet, um in die Ansicht zu übertragen. Kombiniere das mit Funken, einer View Engine und es wird richtig schön. Das Einrichten dauert ein bisschen, aber sobald Sie es in Betrieb genommen haben, habe ich einen großen Schritt in der Komplexität meiner visuellen Anwendungen gesehen, aber es ist so einfach, Code zu machen.

Ich würde es wahrscheinlich nicht genau so machen, aber hier ist Ihr Beispiel:

<if condition="myDtp.ShowPager">
  <div>
    <first />
    <last />
    <div style="clear: both;" />
  </div>
</if>

Das ist ziemlich wartbar, testbar und schmeckt in meiner Codesuppe lecker.

Das Mitnehmen ist, dass sauberer Code wirklich möglich ist, aber es ist eine große Veränderung gegenüber der Art und Weise, wie wir Dinge getan haben. Ich glaube aber noch nicht, dass es allen gefällt. Ich weiß, ich finde es immer noch heraus ...

rball
quelle
2

Steve Sandersons kürzlich veröffentlichtes Buch 'Pro ASP.NET MVC' [1] [2] von Apress schlägt eine andere Alternative vor - das Erstellen einer benutzerdefinierten HtmlHelper-Erweiterung. In seinem Beispiel (aus Kapitel 4 auf Seite 110) wird das Beispiel einer Seitenliste verwendet, es kann jedoch leicht an Ihre Situation angepasst werden.

public static string PostNavigator(this HtmlHelper html, Post previous, Post next, Func<int, string> pageUrl)
{
    StringBuilder result = new StringBuilder();

    if (previous != null || next != null)
    {
        result.Append("<div>");

        if (previous != null)
        {
            result.Append(@"<span class=""left"">");
            TagBuilder link = new TagBuilder("a");
            link.MergeAttribute("href", pageUrl(previous.Id));
            link.InnerHtml = String.Format("<< {0}", html.Encode(previous.Subject));
            result.Append(link.ToString());
            result.Append("</span>");
        }

        if (next != null)
        {
            if (previous != null)
            {
                result.Append(" ");
            }

            result.Append(@"<span class=""right"">");
            TagBuilder link = new TagBuilder("a");
            link.MergeAttribute("href", pageUrl(next.Id));
            link.InnerHtml = String.Format("{0} >>", html.Encode(next.Subject));
            result.Append(link.ToString());
            result.Append("</span>");
        }

        result.Append("</div>");
    }

    return result.ToString();
}

Sie würden es in Ihrer Ansicht mit Code wie folgt aufrufen:

<%= Html.PostNavigator(ViewData.Model.PreviousPost, ViewData.Model.NextPost, id => Url.Action("View", new { postId = id })) %>

[1] http://blog.codeville.net/2009/04/29/now-published-pro-aspnet-mvc-framework-apress/

[2] http://books.google.com/books?id=Xb3a1xTSfZgC


quelle
2
Wow, das ist ein schrecklicher Aufschlag im Code ... Bleck.
FlySwat
Wenn ein 'PostNavigator' ein wiederverwendbares Widget (oder, wenn Sie so wollen, WebControl) mit einem Markup ist, das sich nicht ändert und das von CSS-Regeln gestaltet wird - wie ist das eine so schreckliche Lösung?
@GuyIncognito: Einverstanden, dies scheint analog zu einem WebControl und einer sauberen Lösung zu sein. Irgendwann müssen Sie eine Reihe von HTML-Zeichenfolgen generieren. Eine solche Erweiterungsmethode ist eine gute Lösung.
Gbc
1

Ich hatte gehofft, einen Beitrag von Phil Haack zu sehen, aber er war nicht hier, also habe ich ihn einfach aus http://blog.wekeroad.com/blog/i-spose-ill-just-say-it-you-should ausgeschnitten und eingefügt -learn-mvc / im Kommentarbereich

Haacked - 23. April 2009 - Rob, du bist ein Aufstand! :) Ich finde es lustig, wenn Leute Spaghetti-Code in MVC schreiben und dann sagen "Schau! Spaghetti!" Hey, ich kann auch Spaghetti-Code in Web Forms schreiben! Ich kann es in Rails, PHP, Java, Javascript schreiben, aber nicht in Lisp. Aber nur, weil ich noch nichts in Lisp schreiben kann. Und wenn ich Spaghetti-Code schreibe, schaue ich nicht trübsinnig auf meinen Teller und erwarte Makkaroni. Der Punkt, den die Leute oft machen, wenn sie es mit klassischem ASP vergleichen, ist, dass Menschen mit klassischem ASP dazu neigen, Bedenken zu vermischen. Die Seiten haben eine Ansichtslogik mit Benutzereingabehandlung gemischt mit Modellcode und Geschäftslogik in einem. Darum ging es bei den Spaghetti! Das Mischen von Bedenken in einem großen Durcheinander. Wenn Sie mit ASP.NET MVC dem Muster folgen, ist die Wahrscheinlichkeit geringer. Ja, Möglicherweise haben Sie noch ein bisschen Code in Ihrer Ansicht, aber hoffentlich ist das alles Ansichtscode. Das Muster fordert Sie dazu auf, Ihren Benutzerinteraktionscode nicht dort einzufügen. Legen Sie es in die Steuerung. Fügen Sie Ihren Modellcode in eine Modellklasse ein. Dort. Keine Spaghetti. Es ist jetzt O-Toro Sushi. :) :)

Sameer Alibhai
quelle
1

Ich auch; Ich würde meine Zeit eher mit Silverlight als mit ASP.NET MVC verbringen. Ich habe MVC 1.0 ausprobiert und mir vor einigen Tagen die neueste Version 2.0 Beta 1 angesehen.

Ich kann nicht glauben, dass ASP.NET MVC besser ist als Webform. Das Verkaufsargument von MVC sind:

  1. Gerätetest)
  2. Trennen Sie Design (Ansicht) und Logik (Controller + Modell).
  3. Kein Ansichtsstatus und bessere Verwaltung der Element-IDs
  4. RESTful URL und mehr ...

Webform mithilfe von Code-Behind. Thema, Skin und Ressource sind jedoch bereits perfekt, um Design und Logik zu trennen.

Viewstate: Die Verwaltung der Client-ID erfolgt unter ASP.NET 4.0. Ich mache mir nur Sorgen um Komponententests, aber Komponententests sind nicht genug, um mich von Webform zu ASP.NET MVC zu wenden.

Vielleicht kann ich sagen: ASP.NET MVC ist nicht schlecht, aber Webform ist bereits genug.

Cheung
quelle
-1

Ich benutze MVC seit dem Erscheinen von Preview 3 und obwohl es immer noch wachsende Schmerzen hat, hilft es einiges im Bereich der Teamentwicklung. Wenn Sie versuchen, drei Personen an einer einzelnen Webformularseite zu arbeiten, werden Sie das Konzept verstehen, Ihren Kopf gegen die Wand zu schlagen. Ich kann mit einem Entwickler zusammenarbeiten, der die Designelemente auf der Ansichtsseite versteht, und mit unserem ansässigen Linq-Gott, damit das Modell funktioniert, während ich alles in der Steuerung zusammenstelle. Ich habe mich noch nie in einem Bereich entwickeln können, in dem die Trennung von Bedenken so einfach zu erreichen war.

Das größte Verkaufsargument von ASP.Net MVC - StackOverflow wird auf dem MVC-Stack ausgeführt.

Davon abgesehen ... Ihr Code ist so viel hübscher als das, was ich normalerweise mit der Ansichtsseite mache. Außerdem arbeitet einer der Leute, mit denen ich zusammenarbeite, daran, den HTML-Helfer in eine Tag-Bibliothek zu packen. Anstelle von <% = Html.RandomFunctionHere ()%> funktioniert es wie

<hh: zufällige Funktion />

Ich hoffe nur, dass das MVC-Team irgendwann dazu kommt, weil ich sicher bin, dass sie es besser machen würden.

thaBadDawg
quelle
1
"... einer der Leute, mit denen ich zusammenarbeite, arbeitet daran, den HTML-Helfer in eine Tag-Bibliothek zu packen. Anstelle von <% = Html.RandomFunctionHere ()%> funktioniert es wie <hh: randomfunction />" Das ist es einfach - a Der Aufruf der Methode "RandomFunctionHere ()" ist genau das - ein Methodenaufruf. Es ist kein Markup, und diese Tatsache in etwas zu abstrahieren, das wie ein Tag aussieht, scheint mir den Punkt zu verfehlen. Wenn ich ein Entwickler bin, der sich diesen Code ansieht, würde ich ihn lieber als Methode betrachten als als ein benutzerdefiniertes Tag ...
Jason Bunting
-17

Die Implementierung von ASP.NET MVC ist schrecklich. Das Produkt ist einfach nur zum Kotzen. Ich habe mehrere Demos davon gesehen und schäme mich für MSFT ... Ich bin sicher, die Leute, die es geschrieben haben, sind schlauer als ich, aber es ist fast so, als ob sie nicht wissen, was der Model-View-Controller ist .

Die einzigen Leute, die ich kenne und die versuchen, MVC zu implementieren, sind Leute, die gerne neue Dinge von MSFT ausprobieren. In den Demos, die ich gesehen habe, hatte der Moderator einen entschuldigenden Ton ...

Ich bin ein großer Fan von MSFT, aber ich muss sagen, dass ich keinen Grund sehe, mich mit der Implementierung von MVC zu beschäftigen. Verwenden Sie entweder Web Forms oder jquery für die Webentwicklung. Wählen Sie diesen Gräuel nicht.

BEARBEITEN:

Mit dem Architekturentwurfsmuster Model-View-Controller soll Ihre Domäne von der Präsentation von den Geschäftsregeln getrennt werden. Ich habe das Muster in jedem von mir implementierten Web Forms-Projekt erfolgreich verwendet. Das ASP.NET MVC-Produkt eignet sich nicht gut für das tatsächliche Architekturentwurfsmuster.

mson
quelle
3
Je nach Standort ist MVC ein sofort sehr leistungsfähiges Tool ohne viel zusätzlichen Aufwand. Für mich benutze ich nur, um die Kontrolle über mein Markup zurückzugewinnen. Der Gräuel, den Webformulare dem Markup einer einfachen Website antun können, ist einfach ... verrückt.
Tom Anderson
Ich würde wetten zu sagen, dass MVC tatsächlich ziemlich gut ist, da es in die Form von ASP.NET passt, das darauf ausgerichtet ist, WebForms zu bevorzugen ...
Hugoware
@tom - wenn Sie einen positiven Kommentar zu etwas vorwegnehmen müssen mit ... Je nach Standort ... stehen Sie bereits auf dünnem Eis. Ich bin damit einverstanden, dass die Entwicklung einer Site mit ASP.NET MVC eine gute Wahl sein kann, aber für alles andere scheint es eine schlechte Wahl zu sein.
Mson
4
Ich mag und bevorzuge Schokolade gegenüber Vanille. Möchte jemand mit mir darüber streiten?
Jason Bunting
4
@ Jason SCHOKOLADE IST SCHRECKLICH. Das Produkt saugt einfach nur ... Sie haben mich herabgestimmt?