2010-01-22 20 views
5

ho un ViewModel classe contenente un dizionario (e altre cose irrilevanti per questa domanda):ASP.NET MVC 1.0 - legante modello per i dizionari

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

poi ho un paio di GET/POST azioni che si occupano del dizionario. L'azione GET in primo luogo riempire la Dictionary<int, string> con alcuni dati dal database, e quindi restituire un View:

  • i .Key s saranno in campi nascosti; e
  • il .Value s sarà su un textareas per l'utente da modificare.

L'utente invierà quindi questo modulo, chiamando l'azione POST. Proverà ad elaborare l'input (il processo è irrilevante). Alcune delle coppie Key/Value saranno valide, alcune saranno non valide.

Se ci sono coppie non valide, l'azione POST sarà poi ricostruire un ViewModel, ma questa volta il dizionario dovrebbe contenere solo i non validi coppie, e viene nuovamente visualizzata la stessa vista per l'utente di fissare e prova a inviare di nuovo .

Domanda: qual è il modo più semplice per raggiungere questo obiettivo? &?

Quello che ho finora (funziona bene), nel controller:

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

E la vista:

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

Il problema è che per compiacere il modello di legante devo nominare i miei campi sulla vista con ID sequenziali. Ma devo anche ripetere il dizionario per estrarre le coppie chiave/valore, quindi non può essere un ciclo for (var i = 0; i < Model.Data.Count; i++) {...}.

+0

Si sta utilizzando ASP.NET MVC 1.0 o MVC 2? Il binding dei modelli di raccolte e dizionari è stato significativamente migliorato in MVC 2. – Eilon

+0

@Eilon: ASP.NET MVC 1.0 e deve attenersi ad esso. –

risposta

Problemi correlati