webentwicklung-frage-antwort-db.com.de

Warum ist Razor Pages der empfohlene Ansatz zum Erstellen einer Web-Benutzeroberfläche in Asp.net Core 2.0?

Neue Dinge zu lernen, erfordert Zeit, Raum und Energie. Ich lerne gerade Asp.Net Core MVC 2.0. Diese ASP.NET Core-Lernprogrammübersicht heißt:

Razor Pages ist der empfohlene Ansatz zum Erstellen einer Web-Benutzeroberfläche mit ASP.NET Core 2.0.

Diese Informationen verwirrten mich bei der Entscheidung, ob ich Asp.net Core MVC und Asp.net Core Razor Pages nicht mehr lernen sollte.

  • Warum ist Razor Pages der empfohlene Ansatz zum Erstellen einer Web-Benutzeroberfläche in Asp.net Core 2.0? 

Jede Wegbeschreibung ist willkommen.

36

Razor Pages sind für seitenbasierte Workflows optimiert und können in diesen Szenarien mit weniger beweglichen Teilen als bei herkömmlichen MVC-Modellen verwendet werden. Dies liegt daran, dass Sie sich nicht mit Controllern, Aktionen, Routen, ViewModels und Ansichten befassen müssen (wie Sie dies normalerweise tun würden). Stattdessen ist Ihre Route konventionell und Ihr PageModel dient als Controller, Aktion (en) und ViewModel in einem. Die Seite ersetzt natürlich die Ansicht. Sie müssen auch nicht so viele Ordner wie in MVC haben, was Ihr Projekt weiter vereinfacht.

Von ASP.NET Core - Einfachere ASP.NET-MVC-Apps mit Rasiermesserseiten , ein MSDN-Artikel vom September 2017 von Steve Smith :

[Rasiermesser Seiten] zur Verfügung stellen 

  • eine einfachere Methode zum Organisieren von Code in ASP.NET Core-Anwendungen. Dabei werden die Implementierungslogik und Ansichtsmodelle näher an den View-Implementierungscode gehalten. 
  • Sie bieten auch einen einfacheren Einstieg in die Entwicklung von ASP.NET Core-Apps. 

In diesem Artikel finden Sie weitere Informationen dazu, warum Sie Razor Pages über MVC für seitenbasierte Workflows verwenden sollten. Offensichtlich möchten Sie für APIs immer noch Controller verwenden.

Drittanbieter-Bearbeitung - Nachteile der klassischen MVC-Ordnerorganisation

ASP.NET Core - Feature Slices für ASP.NET Core MVC , ein älterer MSDN-Artikel vom September 2016, beschreibt, warum die klassische MVC-Konvention zum Organisieren von Ansichten und Controllern Nachteile für größere Projekte haben kann. Der Artikel gibt ein Beispiel für vier lose verwandte Anwendungskonzepte: Ninjas, Pflanzen, Piraten und Zombies. In dem Artikel wird beschrieben, wie Sie diese außerhalb der Standardkonventionen für Ordner strukturieren können, indem Sie die Dateien in Ordnern nach Funktion oder Verantwortungsbereich organisieren. 

24
ssmith

Aus der "Architektur moderner Webanwendungen mit asp.net core" ( pdf hier ):

[~ # ~] mvc [~ # ~] : Bei der Verwendung von Controllern und Ansichten war es üblich, dass Anwendungen sehr große Controller hatten . ), das mit vielen verschiedenen Abhängigkeiten und Ansichtsmodellen arbeitete und viele verschiedene Ansichten zurückgab. Dies führte zu einer hohen Komplexität und häufig zu Steuerungen, die dem Single Responsibility Principle Oder Open/Closed Principles Nicht effektiv folgten.

Razor Pages behebt dieses Problem, indem die serverseitige Logik für eine bestimmte logische „Seite“ in einer Webanwendung gekapselt wird. Eine Rasiermesserseite ohne serverseitige Logik kann einfach aus einer Rasiermesserdatei bestehen (z. B. „Index.cshtml“). Den meisten nicht trivialen Razor Pages ist jedoch eine Seitenmodellklasse zugeordnet, die gemäß der Konvention dieselbe Bezeichnung hat wie die Razor-Datei mit der Erweiterung „.cs“ (z. B. „Index.cshtml.cs“). Diese Seitenmodellklasse kombiniert die Verantwortlichkeiten eines Controllers und eines ViewModels. Anstatt Anforderungen mit Controller-Aktionsmethoden zu verarbeiten, werden Seitenmodell-Handler wie "OnGet ()" ausgeführt und die zugehörige Seite standardmäßig gerendert.

Rasiermesserseiten vereinfachen das Erstellen einzelner Seiten in einer ASP.NET Core-App und bieten dennoch alle Architekturfunktionen von ASP.NET Core MVC. Sie sind eine gute Standardauswahl für neue seitenbasierte Funktionen.

Wann wird MVC verwendet? :

Wenn Sie Web-APIs erstellen, ist das MVC-Muster sinnvoller als der Versuch, Razor Pages zu verwenden. Wenn Ihr Projekt nur Web-API-Endpunkte verfügbar macht, sollten Sie im Idealfall mit der Web-API-Projektvorlage beginnen. Andernfalls können Sie jeder ASP.NET Core-App problemlos Controller und zugehörige API-Endpunkte hinzufügen. Sie sollten auch den auf Ansichten basierenden MVC-Ansatz verwenden, wenn Sie eine vorhandene Anwendung von ASP.NET MVC 5 oder früher auf ASP.NET Core MVC migrieren und dies mit geringstem Aufwand tun möchten. Sobald Sie die erste Migration durchgeführt haben, können Sie prüfen, ob es sinnvoll ist, Razor Pages für neue Funktionen oder sogar als Massenmigration einzusetzen.

Hinweis: Unabhängig davon, ob Sie Ihre Web-App mit Razor Pages- oder MVC-Ansichten erstellen, weist Ihre App eine ähnliche Leistung auf und enthält Unterstützung für Abhängigkeitsinjektion, Filter, Modellbindung, Validierung usw.


Update: Einige weitere Gründe, die ich gelesen habe this github Problem kommentiert von scott sauber :

Wir verwenden Razor Pages für ein [komplexes] Krankenversicherungsportal ... Wir haben über 60 Seiten und ich kann sagen, dass ich für vom Server gerendertes HTML nie wieder zu MVC zurückkehren werde. Es ist auch nicht nur für einfache Dinge. Die Krankenversicherungsdomäne ist von Natur aus komplex und kombiniert dies mit der Tatsache, dass es sich um eine mandantenfähige App handelt (wir verkaufen das Produkt an andere Versicherungsunternehmen), was die Komplexität erhöht, da die App in hohem Maße konfigurierbar ist, da verschiedene Versicherungsunternehmen die Dinge ein wenig anders machen .

Warum es benutzen?

  • Razor Pages ist standardmäßig sicherer. Razor Pages bietet Ihnen standardmäßig die Validierung von AntiForgeryToken. Außerdem können Sie festlegen, welche Eigenschaften über [BindProperty] modellgebunden werden sollen, um das Risiko von Überposting-Angriffen zu begrenzen.

  • Razor Pages verfügt standardmäßig über eine bessere Ordnerstruktur, die besser skaliert werden kann. In MVC wird die Standardordnerstruktur einfach nicht skaliert. Separate Ordner für Ansichten, Controller und häufig ViewModels zu haben, wenn alle drei letztendlich eng miteinander verbunden sind, ist eine große PITA, mit der man arbeiten kann. Am Ende springen Sie zu allen drei Ordnern und navigieren durch eine Reihe von Ordnern, wenn Sie eine Funktion hinzufügen oder ändern müssen. Es ist schrecklich. Aus diesem Grund habe ich mich für Feature-Ordner ausgesprochen. Bei Razor Pages befindet sich Ihr PageModel (Controller + ViewModel) im selben Ordner wie Ihre View. Sie können einfach F7 drücken, um zwischen ihnen umzuschalten, was auch sehr praktisch ist.

  • Führt zu mehr wartbarem Code, der sich besser skalieren lässt. Mit MVC war es sehr einfach, einen Controller mit mehr als 10 Aktionen aufzublähen. Oft waren diese Aktionen nicht einmal in irgendeiner Weise miteinander verbunden (außer vielleicht einer Umleitung zwischen den beiden). Dies machte das Navigieren im Controller zum Auffinden von Code sehr schwierig. Es wurde schlimmer, wenn es auch private Methoden im Controller gab, was die Methode noch aufblähte. Mit Razor Pages ist es nahezu unmöglich, Ihr Seitenmodell mit Methoden aufzublähen, die nichts mit Ihrer Seite zu tun haben. Alles, was Sie in Ihr PageModel einfügen, bezieht sich auf Ihre Seite.

  • Unit Testing ist einfacher. Mit einem Controller haben Sie möglicherweise 8 Aktionen, und einige Ihrer Abhängigkeiten, die Sie einfügen, betrafen nur eine oder zwei Aktionen. Wenn Sie also eine einzelne Aktion als Einheit testen, müssen Sie diese entweder unnötig verspotten oder eine Null übergeben, was sich beide eklig anfühlt (dies kann ein wenig mit dem Builder-Muster gelöst werden). Bei Razor Pages beziehen sich die Abhängigkeiten, die Sie einfügen, zu 100% auf GET- und POST Aktionen, mit denen Sie arbeiten. Es fühlt sich einfach natürlich an.

  • Routing ist einfacher. Standardmäßig entspricht das Routing in Razor Pages nur Ihrer Ordnerstruktur. Dies erleichtert das Verschachteln von Ordnern. Beispielsweise befinden sich alle unsere HR-Verwaltungsseiten im Ordner /Administrator Und alle Mitarbeiterseiten im Ordner /Employee. Wir können einen gesamten Ordner autorisieren und sagen, dass die Person ein Administrator sein muss, um zu einem Unterordner von /Administrator Zu gelangen. Dies war viel einfacher als mit mehreren Controllern, aus denen die Administratorfunktionen bestehen.

Ich denke das ist das große Zeug.


Update 2:

Hierbei handelt es sich um eine gewisse Komplexität des MVC-Musters, die die Frage nicht direkt beantwortet, aber nützlich sein kann: Ein Engineering Manager bei Facebook sagte ( hier ) für ihre "ausreichend" große Codebasis und große Organisation, "MVC wurde sehr schnell sehr kompliziert" , woraus sich ergibt, dass MVC nicht skaliert. Die Komplexität des Systems wurde jedes Mal exponentiell, wenn sie versuchten, eine neue Funktion hinzuzufügen, die den Code "fragil und unvorhersehbar" machte. Dies wurde zu einem ernsten Problem für Entwickler, die eine bestimmte Codebasis noch nicht kennen, da sie Angst hatten, den Code zu berühren, um nicht zu brechen etwas. Das Ergebnis war , dass MVC für Facebook auseinanderfiel .

enter image description here

43
S.Serpooshan

Microsoft kehrt zum WebForms-Ansatz zurück, um die Projektstruktur zu vereinfachen und auf das Mantra "Konvention über Konfiguration" zu vertrauen, während die Konfiguration vor dem Entwickler ausgeblendet wird, um die Dinge zu beschleunigen. Aber es hat den Nachteil, dass alles wieder gemischt wird. Ich sehe nicht wie ein kluger Schachzug beim Organisieren aus. Aber hey! Etwas Neues muss die Aufmerksamkeit des Entwicklers gegenüber Microsoft auf sich ziehen. 

Wenn Ihre Seite eine MVC-Web-API für REStful verwendet, ist es einfacher, Razor-Seiten zu verwenden. Wenn nicht, würde ich Ihnen empfehlen, Core MVC zu verwenden.

In großen Projekten, in denen sich Modell und Controller in derselben Datei befinden, ist die Wartung ein Alptraum. Es funktioniert gut für Klassen, die nur zwei Eigenschaften lang sind, verstößt jedoch gegen das Open-Close-Prinzip von OOP. Sie sollten eine Architektur entwerfen und verwenden, die mit der Zeit wachsen kann (erweiterbar) und dennoch stabil und logisch sein muss (Keine Neustrukturierung des Projekts). Erweitern Sie sie einfach mit demselben Muster. 

5
Sterling Diaz

Aus Sicht der Architektur kann die Navigation zu Code usw. hierarchisch definiert werden, um Ihre Lösung zu strukturieren. Ich möchte gerne wissen, wie wir dies in einer auf Razor-Seiten basierenden Lösung tun.

Was ist mit der Unterstützung für Freigabe und Gruppierung Aktionen auf Razor-Seiten? Wenn Sie sich MVC-Controller ansehen, sehen Sie, dass Sie Controller-Aktionen basierend auf der Funktionalität gruppieren können. Man könnte sagen, die Homepage ist eine solche Funktionalität. Dann haben Sie einen HomeController mit About () und Contact (), aber mit Razor Pages wären das andere Seiten. Möglicherweise haben Sie einen großen HomeController mit beispielsweise 5 weiteren Ansichten. Sie können alle im selben HomeController gruppiert werden.

Ein Controller hat zwei Dinge, die Razor Pages nicht haben:

  1. Freigabe: Sie können Controller-Aktionen für verschiedene Seiten freigeben. Manchmal sind Controller-Aktionen nicht nur an eine Seite gebunden, sondern können für mehrere Seiten freigegeben werden. Denken Sie daran, dass Controller-Aktionen auch nur Daten (JSON/XML/etc) zurückgeben können. Manchmal kann das, was sie zurückgeben, auch von verschiedenen Seiten verwendet werden.
  2. Gruppierung: Sie können verwandte Controller-Aktionen in einem Controller zusammenfassen. Ok wenn Sie ein Fan von kleinen Controller-Dateien sind, werden Sie das nicht tun. Das tue ich. Ich gruppiere meine Controller basierend auf der Funktionalität. Das macht die Navigation viel einfacher.

Wie gehen die Razor-Seiten damit um: Verwendung von Verzeichnissen, wie ich finde:

  • Gruppierung: Wenn wir den HomeController haben, könnten wir ein Unterverzeichnis Home mit allen darin enthaltenen Homepages erstellen.

Frage: Für ein einfaches Zuhause wäre das genug. Nehmen wir jedoch an, wir haben einen XController, der für alle Aktionen dasselbe Repository verwendet. Sie können dieses Repository in der Initialisierungsfunktion des XControllers initialisieren. Aber für Seiten im X-Unterverzeichnis müssten Sie das für alle X-Aktionen erneut tun. Ist das trocken?

  • Sharing: Sie könnten ein "Share" -Unterverzeichnis erstellen und darunter Verzeichnisse mit Funktionen, die von Seiten gemeinsam genutzt werden sollten.

Frage: Wenn Sie sich mein Update ansehen, können Sie sehen, dass ich Verzeichnisse verwende, um das Freigabe- und Gruppierungsproblem von Razor-Seiten zu lösen.

Wie würdest du das machen?

oder ... sind Razor-Seiten nur für einfache Websites gedacht, könnte dies die Schlussfolgerung für diese Version von Razor-Seiten sein?.

1

Die Entwickler waren 2013 in Foren und fragten: "Was bedeutet Microsoft, Silverlight ist nicht die empfohlene ... ???" Nur diesmal wird MVC für tot erklärt und es lebe MVVM . Sie werden wahrscheinlich erwarten, dass MVC langsam auf den Schrotthaufen geworfen wird, aber in etwa 18 Monaten beschleunigt wird, und alle Zeit, die Sie damit verbracht haben, MVC zu lernen, wird zu demselben Schrotthaufen gehen. Auch MVVM sieht einfach aus, aber es dauert ein Jahr, um den Dreh raus zu bekommen und es richtig zu machen.

0
daniel