2012-04-12 11 views
2

Meine ultimative Frage ist dies - sollte ein Modellbinder des Modells, oder nur die Bits, die gepostet werden bevölkern, so dass der Controller den Rest bevölkern?MVC Modell Eigenschaften

Zum Beispiel füge ich ein Produkt in meinem System und auf dem Formular möchte ich den Benutzer auswählen, auf welchen Websites das neue Produkt angezeigt wird. Daher möchte ich in meinem Modell eine Sammlung namens "AllAvailableSites" auffüllen, um die Kontrollkästchen für den Benutzer zur Auswahl zu rendern. Ich muss das Modell auch mit allen ausgewählten Websites in einem Post füllen, falls das Formular nicht validiert wird, und ich muss das Formular mit den ursprünglichen Auswahlen darstellen. Es scheint, dass ich den Modellbinder die ausgewählten Sites auf dem Modell setzen lassen sollte und (einmal in der Controller-Methode) setze ich die "AllAvailableSites" auf dem Modell. Klingt das richtig? Es scheint effizienter zu sein, alles im Modellbinder einzustellen, aber jemand schlägt vor, dass es nicht ganz richtig ist.

Ich bin dankbar für jeden Rat; Ich muss sagen, dass die ganze Online-Bindungshilfe von MVC wirklich einfache Beispiele anführt, nichts Kompliziertes.

Benötige ich auch eine GET- und eine POST-Version einer Methode? Können sie nicht einfach das gleiche Modell nehmen? Dann checke ich meinen Modellbinder ein, wenn es ein GET/POST ist, und befülle das ganze Modell entsprechend.

+0

Können Sie tatsächlich sagen, ob etwas GET oder POST wurde? Edit: ja Sie können http://stackoverflow.com/questions/8629624/how-can-i-tell-if-a-method-is-a-result-of-a-get-or-a-post-from -inside-my-mvc-act Immer noch eine schreckliche Idee imo – glosrob

+0

Kannst du deine GET- und POST-Methoden posten? – mattytommo

Antwort

0

Ihre erste Schlussfolgerung ist solide. Ein Modellordner sollte sich nur darum kümmern, eine Instanz eines Modells zu erstellen und seine Eigenschaften mit den Werten zu füllen, die ihm aus dem Aktionskontext zur Verfügung stehen (z. B. Post-Werte) und dann die Validierung durchzuführen. Ihr Controller ist dann dafür verantwortlich, zusätzliche Werte für die Ansicht einzugeben, z. B. die Liste der verfügbaren Websites.

Ich bin mir nicht ganz sicher, was Sie damit meinen, separate GET/POST-Methoden zu benötigen. Wenn Sie eine Instanz eines Modells speichern oder erstellen, sollten Sie einen Beitrag veröffentlichen, sodass der GET-Teil scheinbar irrelevant ist. Es sei denn, Sie so etwas wie meine:

[HttpGet, ActionName("Edit")] 
public ActionResult Edit(MyModel model) 
{ 
    return View(model); 
} 

[HttpPost, ActionName("Edit")] 
public ActionResult SaveEdit(MyModel model) 
{ 
    // validate and save, then 
    return View(model); 
} 

Vielleicht fragen Sie sich, wenn Sie sie nur in eine Aktion kombinieren und nur herausfinden, wenn sie die Form bearbeiten oder veröffentlichen die Ergebnisse des Bearbeitungsformulars innerhalb der Aktion sehen. Ich würde Sie dringend dazu ermutigen, dies nicht zu tun. Es gibt eine Vielzahl von Gründen, aber halten wir es dabei; mach es nicht.

+0

Vielen Dank für Ihre Antwort. Um nur zu verdeutlichen, mit separaten GET/POST-Methoden meinte ich, was Sie getan haben, indem Sie eine separate Controller-Methode für Edit bei GET oder POST haben. Ich wundere mich über Ihre GET-Version der Edit-Methode, weil es eine Model-Instanz dauert, die meine Modell-Binder-Klasse ausgeführt haben wird, obwohl es ein GET ist, aber nichts ausgefüllt worden ist - kann ich überprüfen, ob es ein GET/POST ist in meinem Modellbinder und sparen Sie das Problem der Überprüfung für Dinge, die nicht da sind? Ich rate den Controller dann lädt die Entität aus der DB und nicht die Modellbinder? – Richard

+0

Sie können, aber Sie sollten nicht müssen. Es sollte die Eigenschaften überspringen, für die es keine Werte enthält. Ordner verwenden normalerweise einen ValueProvider, der Werte aus einem Formularpost, JSON-Post, Abfragezeichenfolgenargumenten usw. parsen kann. Der Ordner sollte jede auswählbare Eigenschaft im Modell durchlaufen und versuchen, einen Wert vom ValueProvider abzurufen. Wenn es keins gibt, sollte es übersprungen werden. – HackedByChinese

+0

Hmm und ich habe gerade Request.Form in meinem Modellordner überprüft. Ich bin nicht bereit, die Standardbindung zu verwenden, da mein Formular ziemlich kompliziert ist und die meisten Steuerelemente dupliziert werden (dh wenn mein Produkt auf 3 Seiten angezeigt wird, kann die Beschreibung für jeden variieren und ich habe 3 Steuerelemente in meinem Formular genannt Description_Site1, Description_Site2 etc).Die Anzahl der Websites kann variieren, so dass Modell kann eine einfache Eigenschaft für jeden haben, würde eine Liste benötigen. Haben Sie auch ein Gitter, das später auf der Seite erscheint, die zusätzliche Reihen haben kann, die auf der Fliege hinzugefügt werden - ich traue nur nicht dem defaultmodelbinder .... sollte ich? – Richard