none
ASP.NET Core MVC - Zustand eines Models halten RRS feed

  • Frage

  • Guten Abend,

    ich habe mich in den letzten Tagen endlich mal genauer mit dem ASP.NET Core MVC befasst und Razor. Anfänglich habe ich hier fast in die Tischplatte gebissen, weil ich einfach nicht gemerkt habe, dass es einen gewaltigen Unterschied gibt zwischen Views und Pages.

    Jetzt, so beim experimentieren, ist mir aufgefallen, dass die Zustände eines Models "vergessen" werden. Oder ich hab einen total falschen Ansatz.

    Also, ich habe bei Views einen Ordner angelegt, der heißt Cars. Ich habe den passenden Controller und ein Model erstellt. Wenn Index aufgerufen wird, werden mir auch brav die ersten 10 Autos aus der Datenbank aufgelistet.

    Jetzt habe ich einen Button erstellt, und im Controller die passende Methode, wo ihr ungefähr meinen Denkfehler oder Idee seht:

    public IActionResult NextPage()
            {
                model.CurrentPage += 1;
                return RedirectToAction("Index");
            }

    Die Experten unter euch werden sicherlich sehen, dass geht so nicht. Das model ist wieder bei null. Aber wie kann ich es erreichen, dass das model beibehalten wird? Oder geht das absolut gar nicht?

    Gruß
    Andy

    Donnerstag, 28. Juli 2022 20:18

Antworten

  • Hallo Andy,

    man muss sich bei Webanwendungen immer vor Augen halten, dass jeder Request eigentlich eine komplett eigene, neue, völlig unabhängige Instanz der Gesamtanwendung ist. D.h. jeder Seitenaufruf, jeder API Aufruf, jedes Laden eines Elements weiß im ersten Moment rein gar nichts von irgendwelchen anderen Aufrufen, weder vorherige noch parallel laufende.

    Es gab und gibt viele Ideen, wie man diese Zustandslosigkeit umgehen kann. Die allermeisten Ideen waren gut gemeint aber wie man so schön sagt "Gut gemeint ist die kleine Schwester von sch***e gemacht" :). Bspw. der ViewState bei WebForms. Unsägliches Teil, teils extrem große Datentransfers von und auch zum Server, je nach Control, Seitenaufbau, Projektart, ... klappt es oder auch nicht.

    Sessions bspw. sind eine "total tolle" Idee. Dumm nur, dass manche das Konzept dermaßen ausgereizt haben und komplette Datenbanken in Sessionvariablen geladen haben.

    Statische Klassen/Eigenschaften oder Application Variablen sind auch eine prima Sache (Nicht.) Die sind aber für alle Requests gleichzeitig da und nicht nur für den aktuellen Request.

    Wenn man das nun alles berücksichtigt sollte klar sein, dass man aufgrund der Zustandslosigkeit jeden Request komplett autark behandeln muss. Also übergebene Variablen auslesen, Datenbankverbindung öffnen, gewünschte Daten laden, an Client zurückgeben.

    Bestimmte Arbeiten nimmt dir die ASP.NET [Core] Engine dabei ab, bspw. kann man verschiedene Elemente über ViewData und andere integrierte Mechanismen setzen und abrufen. Aber die Hauptarbeit bleibt trotzdem erstmal bei dir.

    Ggfs. hilft es dir, wenn Du dich mal durch ein gerade für dich evtl. passendes Tutorial durcharbeitest.

      Tutorial: Hinzufügen von Sortieren, Filtern und Paging: ASP.NET MVC mit EF Core


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert AndreasMahub Donnerstag, 28. Juli 2022 21:22
    Donnerstag, 28. Juli 2022 20:34
    Moderator

Alle Antworten

  • Hallo Andy,

    man muss sich bei Webanwendungen immer vor Augen halten, dass jeder Request eigentlich eine komplett eigene, neue, völlig unabhängige Instanz der Gesamtanwendung ist. D.h. jeder Seitenaufruf, jeder API Aufruf, jedes Laden eines Elements weiß im ersten Moment rein gar nichts von irgendwelchen anderen Aufrufen, weder vorherige noch parallel laufende.

    Es gab und gibt viele Ideen, wie man diese Zustandslosigkeit umgehen kann. Die allermeisten Ideen waren gut gemeint aber wie man so schön sagt "Gut gemeint ist die kleine Schwester von sch***e gemacht" :). Bspw. der ViewState bei WebForms. Unsägliches Teil, teils extrem große Datentransfers von und auch zum Server, je nach Control, Seitenaufbau, Projektart, ... klappt es oder auch nicht.

    Sessions bspw. sind eine "total tolle" Idee. Dumm nur, dass manche das Konzept dermaßen ausgereizt haben und komplette Datenbanken in Sessionvariablen geladen haben.

    Statische Klassen/Eigenschaften oder Application Variablen sind auch eine prima Sache (Nicht.) Die sind aber für alle Requests gleichzeitig da und nicht nur für den aktuellen Request.

    Wenn man das nun alles berücksichtigt sollte klar sein, dass man aufgrund der Zustandslosigkeit jeden Request komplett autark behandeln muss. Also übergebene Variablen auslesen, Datenbankverbindung öffnen, gewünschte Daten laden, an Client zurückgeben.

    Bestimmte Arbeiten nimmt dir die ASP.NET [Core] Engine dabei ab, bspw. kann man verschiedene Elemente über ViewData und andere integrierte Mechanismen setzen und abrufen. Aber die Hauptarbeit bleibt trotzdem erstmal bei dir.

    Ggfs. hilft es dir, wenn Du dich mal durch ein gerade für dich evtl. passendes Tutorial durcharbeitest.

      Tutorial: Hinzufügen von Sortieren, Filtern und Paging: ASP.NET MVC mit EF Core


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert AndreasMahub Donnerstag, 28. Juli 2022 21:22
    Donnerstag, 28. Juli 2022 20:34
    Moderator
  • Hallo Stefan,

    danke für deine sehr ausführliche Antwort. Ich hatte im übrigen Sessions gleich als erstes probiert, da es mir vor JAHREN bei einem ASP.NET-Projekt sehr geholfen hatte.

    Aber im Grunde hast du schon recht damit, man sollte grundsätzlich den Gedanken im Kopf behalten, es gibt kein "vorher". 

    Gibt es eigentlich zu diesem Thema ein vernünftiges AKTUELLES Buch? Ich hab mich bei Amazon echt schwer getan was zu finden. Überhaupt, wenn man, so wie ich, vor 10 Jahren zuletzt was mit ASP.NET Webforms gemacht hat, und jetzt wieder "einsteigt", also, ICH war komplett überfordert. Es hat sich so krass in den letzten 10 Jahren alles entwickelt und gewandelt, dass ich mir vor kam, als würde ich ein komplettes Neuland betreten.

    Bis ich überhaut die Autos aufgelistet bekommen habe, habe ich locker zwei Tage gebraucht. Mir schwirrten plötzlich diese ganzen Begriffe um die Ohren wie Controllers, Views, Razor View, Razor Pages, ViewData, TempData usw. usw.

    Und, ich habe echt Angst mir ein Buch zu kaufen, weil, selbst die Anleitungen im Internet, die ja eigentlich aktueller sein müssten als ein Buch, waren (darf ich das sagen?) für'n Ar***. Sie funktionierten nicht, weil irgendwelche Abhängigkeiten mittlerweile eine ganz andere Versionsnummer brauchten. Und du weißt teilweise gar nicht, wo du suchen sollst. 

    Gruß
    Andy

    Donnerstag, 28. Juli 2022 21:22