2010-01-22 2 views
5

J'ai un ViewModel classe contenant un dictionnaire (et d'autres choses non pertinentes pour cette question):ASP.NET MVC 1.0 - liant modèle pour les dictionnaires

public class MyViewModel { 
    public Dictionary<int, string> Data { get; set; } 
    /* ... */ 
} 

J'ai deux ou trois GET/POST actions ce problème avec le dictionnaire. L'action GET d'abord remplir le Dictionary<int, string> avec des données de la base de données, puis retourner un View:

  • les .Key s seront sur champs cachés; et
  • le .Value s sera sur un textareas pour l'utilisateur à éditer.

L'utilisateur soumettra alors ce formulaire en appelant l'action POST. Il va essayer de traiter l'entrée (le processus n'est pas pertinent). Certaines des paires Key/Value seront valides, certaines seront non valide.

S'il y a des paires non valides, l'action POST sera ensuite reconstruire un ViewModel, mais cette fois le dictionnaire ne doit contenir que les invalides paires, et affiche de nouveau le même point de vue pour l'utilisateur de fixer et essayer de soumettre à nouveau .

Question: quel est le plus simple & moyen le plus simple pour y parvenir?

Ce que j'ai jusqu'à présent (fonctionne bien), dans le contrôleur:

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); 
    } 
} 

Et la vue:

<% 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++; } %> 

Le problème est que pour plaire au liant modèle je dois nommer mes champs sur la vue avec des identifiants séquentiels. Mais je dois aussi parcourir le dictionnaire pour extraire les paires clé/valeur, donc ce ne peut pas être une boucle for (var i = 0; i < Model.Data.Count; i++) {...}.

+0

Utilisez-vous ASP.NET MVC 1.0 ou MVC 2? La liaison de modèles de collections et de dictionnaires a été significativement améliorée dans MVC 2. – Eilon

+0

@Eilon: ASP.NET MVC 1.0, et doit s'y tenir. –

Répondre

1

La solution est décrite dans cet article - Dictionary Model Binder in ASP.NET MVC2 and MVC3

Le code est à usage général et peut être utilisé avec MVC 1 aussi.

+0

C'est dommage ce que personne n'a donné de réponse depuis un an. :( –

Questions connexes