Laden...

MVC mapping bestehende Instanzen

Erstellt von mosspower vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.954 Views
mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren
MVC mapping bestehende Instanzen

Hallo,

ich bin gerade neu eingestiegen in MVC und hätte da eine Frage bezüglich dem Mapping von Parametern auf ein Model Objekt.

Aktuell habe ich ein Objekt und gebe im Controller dieses als Model zurück für die View.
In der View schreibe ich dann

@Using (Html.BeginForm("ActionName", "ControllerName", Model))

jetzt habe ich aber folgende Probleme:

a) Wenn ich hier explizit method Type "POST" angebe, dann macht er mir einen ganz häßlichen Requeststring mit den ganzen Parametern - lasse ich das POST weg, werden auch die Formdaten geposted, aber nur die Felder, welche auch bearbeitet werden auf der View, so ist z.B. eine ID dann weg 🙁

b) Wie kann ich sicherstellen (wenn überhaupt möglich), dass er die bestehende Instanz verwendet, denn aktuell legt er (bedauerlicherweise???) eine neue Instanz an und nimmt nicht das initiale Modelobjekt. Wahrscheinlich macht er das dann später anhand von dem Actionparameter? Kann man das nicht gleich festlegen, bzw. mitteilen, dass er die Instanz verwenden soll, weil das würde mir sehr viel Arbeit sparen, denn ich habe in den Objekten eine Art Cache um feststellen zu können, ob auch wirklich Änderrungen durchgeführt wurden. So müsste ich jetzt nochmal (Session) zwischenspeichern und dann selber mappen in einem Filter. 🙄

Ich will hier erst mal auf Nummer sicher gehen und nachfragen, nicht dass ich dann wieder umsonst sehr viel Arbeit mache, weil man doch irgendwo einstellen kann auf welches Objekt er mappen soll.

Danke schon mal im Voraus für etwaige Hilfe.

5.657 Beiträge seit 2006
vor 8 Jahren

Hi mosspower,

am besten solltest du dich zuerst einmal mit den Grundlagen der Web-Entwicklung bzw. von MVC auseinandersetzen. Es gibt sehr gute Tutorials und Videos zu den Themen. Deine Fragen lassen jedenfalls vermuten, daß du noch nciht ganz verstanden hast, wo der Unterschied zwischen einer Desktop- und einer Web-Anwendung liegt.

Das unterschiedliche Verhalten von POST- und GET-Requests sollte auf jeden Fall zu den Grundlagen gehören. Ohne solche Grundkenntnisse macht man sich das Leben nur unnötig schwer, und es gehört ja nicht besonders viel dazu, das mal bei Google einzugeben und nachzulesen, was es damit auf sich hat. Das gleiche gilt für die Session und für Objekte, die für unterschiedliche Requests zur Verfügung stehen sollen. Um ein Formularfeld zu übermitteln, für das kein Editor vorhanden ist, gibt es die @HTML.HiddenFor-Methode.

Christian

Weeks of programming can save you hours of planning

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren

Hallo,

sorry, dann habe ich mich auf die Schnelle falsch ausgedrückt, Ich hab schon Erfahrungen mit Webanwendungen und auch das PDF-Buch durchgelesen https://anhtan1987.files.wordpress.com/2014/12/programming-asp-net-mvc-4.pdf

Ich denke, dass ich es schon verstanden habe, weil ich 2005 schon mit Struts / Java gearbeitet und da ist vieles ähnlich, Filter, Model, Actions ect.

Das Problem welches ich habe ist, dass bei einem Post an dem URL alle Parameter (gehängt) werden, die vorher vorhanden waren. Das schaut unschön aus. Mir wäre es lieber, das Framework würde auf das Ursprungsmodelobjekt mappen - da kenne ich mich noch nicht so aus, wie das gehen sollte, weil aktuell erstellt er immer als Parameter für die Action eine neue Instanz des Modelobjektes.

5.657 Beiträge seit 2006
vor 8 Jahren

Mir wäre es lieber, das Framework würde auf das Ursprungsmodelobjekt mappen - da kenne ich mich noch nicht so aus, wie das gehen sollte, weil aktuell erstellt er immer als Parameter für die Action eine neue Instanz des Modelobjektes.

Siehe Seite 41 in dem von dir verlinkten Buch: "Model binding complex objects"

Christian

Weeks of programming can save you hours of planning

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren

Mir wäre es lieber, das Framework würde auf das Ursprungsmodelobjekt mappen - da kenne ich mich noch nicht so aus, wie das gehen sollte, weil aktuell erstellt er immer als Parameter für die Action eine neue Instanz des Modelobjektes.

Siehe Seite 41 in dem von dir verlinkten Buch: "Model binding complex objects"

Vielen Dank für den Hinweis. Das Problem ist aber gerade, dass bei dem Beispielcode:

public ActionResult Create(Auction auction)
{
 // ... Hier kommt die auction als neue Instanz, ich brauch die registrierte Instanz auf welche dann die Requestparameter gemapped werden.
}

Das Modelobjekt "Auction" eine neue Instanz ist und genau das würde ich sehr gerne vermeiden, weil ich dann sehr viel "Zusatzaufwand" habe, da ich dann in einem Filter ein "Zurückmappen" durchführen muss. Ich habe in allen Modelobjekten schon in den Basisklassen alles was ich brauche (Touched- bzw. Dirtyflag, Caching usw.)
Es sieht so aus, dass das nicht geht. X(

16.806 Beiträge seit 2008
vor 8 Jahren

Korrekt. Das geht so nicht und das ist auch gut so.
Schau Dir mal MVC tiefer an; lerne wie HTTP funktioniert und dann wirst Du auch verstehen, wieso das so ist.

Du darfst niemals Daten zwischen zwei Actions zwischenspeichern.
Das muss immer über die View und den Client zurück gesandt oder über eine Datenbank persistiert werden - immer; ohne Ausnahme.

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 8 Jahren

Hi,

also, ich verstehe das jetzt überhaupt nicht. Was hat denn HTTP damit zu tun ob man eine neue Instanz von, siehe obiges Beispiel, Auction erstellt oder eine gebrauchte, bzw. registrierte manipuliert? 🤔

Der liest im Endeffekt nur aus dem Request die Parameternamen und schaut mittels Reflection ob es in der Klasse die jeweiligen Properties gibt. Warum soll man da eine neue Instanz (IMMER) erstellen müssen?

Ich muss jetzt in der Session zwischenspeichern und rübbermappen, das ja auch nicht sehr schön, aber ich muss das so machen, da ich die "Entities" auch in anderen (nicht MVC) Projekte in einem separatem Service/Model Projekt benutze. Ich möchte ja nicht auf die Datenbank gehen und erst schauen, ob im Request neue Werte vorhanden sind und IMMER speichern möchte ich auch nicht, weil ich das unprofessionell finde. Ich speichere nur, wenn sich etwas geändert hat.

Ich sehe ja irgendwie ein, dass es nicht geht, aber warum es NICHT GEHEN darf, bzw, was es mit HTTP zu tun haben soll erschließt sich mir überhaupt nicht.

16.806 Beiträge seit 2008
vor 8 Jahren

HTTP ist ein verbindungsloses Protokoll.
Wenn Du Action A verlässt, weist Du niemals bzw. kannst niemals sicherstellen, dass Action B wirklich irgendwann erreicht wird.
Zudem können zeitgleiche Aufrufe existieren. Auch die Aufrufreihenfolge kannst Du nicht garantieren.

Es ist daher sehr unpraktisch, wenn nicht gar fahrlässig, dass Du in Action A ein Objekt in der Anwendung hälst, damit dann in Action B darauf zugreifen kannst.
Daher persistiert man immer über Datenbanken.

Auch Sessions sind nicht gerade dolle, da auch diese parallele Zugriffe auch nicht wirklich unterstützen / es einfacher machen.

Du musst es auch nicht so machen; korrekt wäre das neue Laden.
Das Zeug ist mein täglich Brot - ich weiß schon, was ich sag 😉