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++) {...}
.
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
@Eilon: ASP.NET MVC 1.0 e deve attenersi ad esso. –