Ich habe eine Ansichtsmodell Klasse ein Dictionary (und andere irrelevante Dinge für diese Frage) enthält:ASP.NET MVC 1.0 - Modell Bindemittel für Wörterbücher
public class MyViewModel {
public Dictionary<int, string> Data { get; set; }
/* ... */
}
Dann habe ich ein paar GET
/POST
Aktionen das mit dem Wörterbuch zu tun haben. Die GET
Aktion wird zunächst die Dictionary<int, string>
mit einigen Daten aus der Datenbank füllen, und dann wieder ein View
:
- die
.Key
s auf versteckte Felder sein wird; und - die
.Value
s wird auf eine textareas für den Benutzer zu bearbeiten.
Der Benutzer sendet dann dieses Formular und ruft die POST
Aktion auf. Es wird versuchen, die Eingabe zu verarbeiten (der Prozess ist irrelevant). Einige der Key
/Value
Paare sind gültig, einige werden ungültig sein.
Wenn es ungültige Paare sind, die POST
Aktion wird dann rekonstruieren einen Ansichtsmodell, aber dieses Mal das Wörterbuch sollte nur die ungültig Paare enthalten, und wird die gleiche Ansicht für den Benutzer erneut anzeigen zu beheben und versuchen Sie es erneut einreichen .
Frage: Was ist die einfachste & sauberste Möglichkeit, dies zu erreichen?
Was ich bisher (Arbeits fein), in der Steuerung:
public ActionResult MyAction(MyViewModel vm) {
/* Process data */
if (are there invalid pairs?) {
var vmErrors = new MyViewModel();
/* ... fill the ViewModel ... */
vmErrors.Data =
vm.Data
.Where(x => IsInvalid(x))
.ToDictionary(x => x.Key, x => x.Value);
return View(vmErrors);
}
}
und die Aussicht:
<% var i = 0; foreach (var p in Model.Data) { %>
<%= Html.Hidden("vm.Data[" + i + "].key", vm.Key %>
<%= Html.TextArea("vm.Data[" + i + "].value", vm.Value %>
<% i++; } %>
Das Problem, das ist das Modell Binder bitte ich muss nennen meine Felder in der Ansicht mit sequenziellen IDs. Aber ich muss auch über das Dictionary iterieren, um die Schlüssel/Wert-Paare zu extrahieren, so dass es keine Schleife sein kann.
Verwenden Sie ASP.NET MVC 1.0 oder MVC 2? Modellbindung von Sammlungen und Wörterbüchern wurde in MVC 2 – Eilon
@Eilon: ASP.NET MVC 1.0 erheblich verbessert und muss dabei bleiben. –