2010-01-22 18 views
5

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.

+0

Verwenden Sie ASP.NET MVC 1.0 oder MVC 2? Modellbindung von Sammlungen und Wörterbüchern wurde in MVC 2 – Eilon

+0

@Eilon: ASP.NET MVC 1.0 erheblich verbessert und muss dabei bleiben. –

Antwort

1

Die Lösung wird in diesem Artikel beschrieben - Dictionary Model Binder in ASP.NET MVC2 and MVC3

Der Code für allgemeine Zwecke und könnte mit MVC 1 auch verwendet werden.

+0

Es ist schade, was niemand eine Antwort für ein Jahr gab. :( –