2009-08-13 21 views
3

Ich habe ein Client dto, das eine Reihe von Feldern enthält und auch eine Liste enthält.Komplexe Modellbindung

Jetzt kann ich ganz einfach daran binden, und es zeigt den Client mit all seinen Adressen an. Die Sache ist, dass der Benutzer Adressen dynamisch löschen und hinzufügen kann.

Ich dachte über das Hinzufügen von Formularen um jede Adresse, aber dann lande ich mit inneren Formen und ich weiß, Browser spielen nicht gut damit.

Dann dachte ich über die Verwendung von Javascript, aber wenn eine Adresse entfernt wird, muss ich über alle Adressen gehen und ihre Indizes (Adressen [0] .City) ändern, weil ich festgestellt habe, wenn die Indizes nicht in Ordnung sind, und die Aktion nimmt eine ClientForm als Parameter, dann nur die Adressen, die aufeinander folgende Indizes haben und sie bei 0 beginnen - wird in der Liste ClientForm.Addresses erhalten.

Alle anderen Lösungen, die einfach zu implementieren sind? Fehle ich etwas?

Antwort

1

Wenn Sie eine Senden-Schaltfläche mit einem anderen Namen auf jeder der Adressen, aber keine Formular-Tags platzieren, kann Ihr äußeres Formular nach dem Vorhandensein einer bestimmten Schaltfläche suchen und zur richtigen Aktion umleiten (z. B. Adresse 1 bearbeiten, löschen Adresse 3 usw.)

Wenn Sie jquery Validierung verwenden, ist eine Einschränkung, dass der Typ aller "untergeordneten" Übergabeknöpfe auf "Abbrechen" gesetzt sein muss, so dass beim Drücken keine Validierung erfolgt.

HTH,

Dan

+0

nicht sicher, ob ich verstehen, was Sie meinen: „Ihre äußere Form für die Existenz überprüfen ....“ ein kurzes Beispiel wäre toll. – sirrocco

1

Für jede Adresse auf Ihrer Seite ein verstecktes Formularfeld addresses.Index genannt liefern, wird dies einen ganzzahligen Wert annehmen. Der ASP.NET MVC-Modellbinder (in Version 2 und höher) erhält die mehreren Werte des Formularfelds addresses.Index und verwendet die Ganzzahlwerte, um zu bestimmen, welche addresses[index].property Feldwerte logisch zusammengehören.

z.

addresses.Index = 0 
addresses.Index = 3 

Würde das Modell Bindemittel aufgefordert zu gehen auf der Suche ...

addresses[0].City 
addresses[0].Street 
addresses[3].City 
addresses[3].Street 

... und ein ICollection<Address> in Ihrer Controller-Aktion mit zwei Elementen füllen.

Natürlich, wenn Sie diese Datensätze auf Ihrer Seite löschen und einfügen können, muss Ihr Javascript den nächsten Index zur Verwendung in einer globalen Variablen verfolgen, um die Wiederverwendung desselben Indexes für mehrere Zeilen zu vermeiden verlassen Sie sich nur auf die Länge einer Tabelle, die die Adresselemente usw. enthält).

Diese Lösung näher beschrieben durch Phil Haack here.

+0

Der Index muss nicht einmal eine ganze Zahl sein, oder? Ich benutzte nur einen eindeutigen Wert wie die ID, die zufällig eine ganze Zahl war. Auf diese Weise musste ich dem Kunden keinen Index zuweisen, um sicherzustellen, dass er einzigartig bleibt. – Benjamin