Announcement

Collapse
No announcement yet.

MVC3, Actions, Klassenattribute

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MVC3, Actions, Klassenattribute

    Hallo zusammen,

    ich habe ein für mich unerklärliches Problem, wobei ich eure Unterstützung benötige.

    Es geht um folgendes:
    Ich habe ein Controller mit mehreren Actions (Index, EmptyIndex, Create, Details, ...). In einer Action befülle ich ein Klassenattribut und möchte dieses Attribut in einer anderen Action verwenden. Das Befüllen läuft wunderbar, jedoch beim Aufruf der anderen Action ist das Klassenattribut leer. Warum? Ich verstehe es nicht ganz und habe gehofft, dass ihr mir hier evtl helfen könntet.

    Code:
    namepase ...
    {
       public class ...
       {
          public MyModel myModel = new MyModel();
          
          public ActionResult Index()
          {
              var MyModelList = db.seachMyModels(myModel).ToList(); -- Funktion in meinem Models die eine Liste zurückliefert...
              return View(MyModelList);
          }
          
          public ActionResult EmptyIndex()
          {
                -- hier befülle ich eine myModel mit leeren Inhalten... und habe gedacht, dass beim Redirect die leeren Inhalte vom Index-Action erkannt werden, aber leider geht es nicht
                return RedirectToAction("Index");
          }
       }
    }
    Kann man von einer Action nicht zu einer anderen Action springen und dabei Klassenattribute für beide Actions bekannt machen? Oder habe ich evtl. nur einen Fehler in meinem Code?

    Bitte um Hilfe.

    Danke und VG

  • #2
    Eine MVC Anwendung hat per se keinen Zustand wenn Du nicht explizit etwas dafür tust (Session server oder ähnliches). Beim jedem Request der rein kommt wird dein Controller neu instanziiert und so wird eben auch Deine Model Klasse neu erzeugt. MVC funktioniert anders als WebForms. In WebForms funktionert das aber auch nur wegen dem ViewState. Schaltest Du diesen aus hast Du genau dasselbe Problem.

    Was möchtest Du denn am Ende tun? Vielleicht kann ich Dir eine Lösung vorschlagen die eher MVC-Style ist

    Ach ja... pass bitte etwas auf die Wortwohl auf. MyModel ist in diesem Fall kein Klassenattribut, sondern ein Feld einer Klasse. Attribute sind ein Mechanismus um Logik an bestehende Klassen anzuhängen. In den meisten Fällen stehen sie zwischen eckigen Klammern und über der Deklaration des zu erweiternden Codes. (http://msdn.microsoft.com/de-de/libr.../z0w1kczw.aspx oder http://msdn.microsoft.com/de-de/library/bb979157.aspx)

    Comment


    • #3
      Danke für die Antwort. Ich habe schon so etwas geahnt.

      Die Wortwahl habe ich nicht für meine Applikation verwendet sondern nur für das Beispiel in diesem Post.

      Also was ich will ist, immer das gleiche Fenster zu benutzen. Abhängig von welchem Fenster ich komme, das gleiche Resultset zu verändern und vom selben Action anzeigen zu lassen.

      Ich habe schon eine Lösung gefunden und zwar für jede Action eine View - die aber gleich ist wie die anderen - zu erstellen. Das Problem ist nur, dass ich wenn ich bei einer View Anpassungen durchführen muss, das ganze für alle anderen Views machen muss. Genau das wollte ich eigentlich nicht, als ich mir gedacht habe, MVC zu benutzen.

      Comment


      • #4
        Ich verstehe das immer noch nicht ganz Ich wollte eigentlich wissen welche Aufgabe Dein Programm erledigt nicht wie es technisch umgesetzt ist. Fenster, Views und Controller dürfte es beinahe in jeder Anwendung geben. Versuche doch mal zu beschreiben was Du erledigen willst. Vielleicht kann ich Dir einen schönen Vorschlag machen. Verschiedene Views finde ich jetzt auch seltsam, zumal in einem View ja im Endeffekt sowieso keine Logik stehen sollte.

        Comment


        • #5
          Die Billiglösung wäre myModel einfach im TempData des Controllers abzulegen. Das macht aber nur bei einem Redirect Sinn wo du die Kontrolle hast was als nächstes passieren soll(TempData überlebt genau einen Request). Darüber hinaus bräuchtest du andere/bessere Lösungen um einen State zu verwahren.

          Comment


          • #6
            Ich würde gänzlich von State abraten, aber das hängt natürlich vom Szenario ab welches man lösen will. Je weniger Zustand eine Anwendung hat desto weniger fehleranfällig ist sie.

            Comment


            • #7
              Originally posted by fanderlf View Post
              Ich würde gänzlich von State abraten, aber das hängt natürlich vom Szenario ab welches man lösen will. Je weniger Zustand eine Anwendung hat desto weniger fehleranfällig ist sie.
              Ohne State keine sinnvolle Anwendung. Es geht nur darum auf unnötigen State zu verzichten und den den man braucht an der richtigen Stelle abzulegen (Client,Server,DB oder sonstiges Persistenzsystem). Ist wie die Forderung in OOP das Klassen möglichst wenig in Beziehung stehen sollen. Ja, mit weniger Beziehung ist ein System leichter beherrschbar aber ohne Beziehung kann das System auch nix mehr sinnvolles tun.

              Comment


              • #8
                Ich finde es schön, dass eine Diskussion entstanden ist. Ich glaube, das Thema worum es geht ist auch klar. Bevor ich das mit dem State mal recherchiere, was sich so anhört, als wäre es eine passende Lösung meines Problems, würde ich gern wissen, ob man das nicht mit einer Übergabe eines Parameters von einer Action in die andere lösen kann?

                Comment


                • #9
                  Dir ist klar das ein Redirect durch den Client geht? Möchtest du das Object durch die Gegend transportieren?

                  Comment


                  • #10
                    Das war mir nicht klar. Um ehrlich zu sein habe ich grad mit MVC angefangen und stoße deswegen auf wahrscheinlich grundlegende Sachen, die jeder MVC Entwickler kennt. Danke für diesen Hinweis. Ich werde mal weiter probieren und hier meine Ergebnisse/Lösung mitteilen.
                    Thx guys

                    Comment


                    • #11
                      Grundsätzlich ist state nicht die Art und Weise wie Daten in einer Webanwendung transportiert werden. Ich gebe Dir mal ein Beispiel anhand eines Shops:

                      1. Ein Verkäufer loggt sich auf die Plattform ein
                      2. Ein Verkäufer erstellt ein neues Produkt. Das wird mit einer festen ID und bestimmten Eigenschaften in der Datenbank abgelegt
                      3. Der Verkäufer kann sich alle seine Produkte auf einer Übersichtsseite ansehen
                      4. Der Käufer kommt auf die Homepage der Plattform
                      5. Der Käufer gibt eine Suchanfrage ein
                      6. Dem Käufer wird eine Liste mit angezeigt. Diese Liste wird durch eine Suche auf der Datenbank erzeugt
                      7. Der Benutzer klickt auf ein Produkt um Details zu sehen. Der Server holt alle Daten die zu einer bestimmten ID gehören aus der Datenbank und schickt sie an den Käufer.
                      ...

                      Etwas in der Art wollte ich hören

                      Wie Du siehst ist hier das einzige was Zustand hat die Datenbank. Die Webanwendung dazwischen also die Session hat gar keinen Zustand mit Ausnahme des Logins (was wohl in 98% der Fälle auch der einzige Zustand in einer Session bleiben wird).

                      Ich muss erstmal das grundsätzliche Problem verstehen bevor ich einen guten Lösungsvorschlag anbieten kann. Das Web bietet viele Möglichkeiten wie man Probleme lösen kann. Um das aber mittelfristig alles noch verstehen zu können sollte man sich schon Gedanken machen wie man so etwas umsetzt.

                      Comment


                      • #12
                        8.. Der Käufer wählt das Produkt zum Kauf aus.

                        Wo wird das gehalten?

                        Üblicherweise in Sessions.
                        Christian

                        Comment


                        • #13
                          Originally posted by Christian Marquardt View Post
                          8.. Der Käufer wählt das Produkt zum Kauf aus.

                          Wo wird das gehalten?

                          Üblicherweise in Sessions.
                          Mittlerweile wird auch der Warenkorb persistiert und nicht mehr in der Session gehalten, sofern der Benutzer einen Account hat. Es macht doch auch total Sinn dem Benutzer beim nächsten Besuch der Seite seinen gefüllten Warenkorb präsentieren zu können.

                          Comment


                          • #14
                            Das Vorgehen sehe ich als zweifelhaft an. Insbesondere bei komplexen Anwendungen, die etwas mehr als ein "Warenkorb" können müssen. Wann werden die Daten aus der DB gelöscht? Man hat eine DB, die mit nicht mehr gültigen Daten gefüllt ist. Des Weiteren ist das programmieren an den Frameworks/Servern vorbei. Diese stellen eben gerade Mechanismen zur Verfügung (Sessions) um solche Daten zu halten. Applkationsweit, Sessionweit, Requestweit. Und nein, Seiten, die dem Anwender "wieder" seinen Warenkorb präsentieren, sind nervtötend..aus meiner Sicht
                            Christian

                            Comment


                            • #15
                              Seltsamerweise funktioniert das bei allen "großen" wie z.B. Amazon. Das ist aber glaube ich dem Threadersteller ganz egal und er hat andere Probleme.

                              Comment

                              Working...
                              X