2010-01-05 11 views
6

Vorrei sapere come posso associare i miei valori di modulo alla mia vista fortemente digitata da una casella MultiSelect.asp.net mvc modello con visualizzazione fortemente tipizzata con multiselect

Ovviamente quando il modulo invia la casella di selezione multipla invierà una stringa delittemered dei miei valori selezionati ... qual è il modo migliore per riconvertire questa stringa di valori in una lista di oggetti da allegare al mio modello da aggiornato?

public class MyViewModel { 
    public List<Genre> GenreList {get; set;} 
    public List<string> Genres { get; set; } 
} 

Quando si aggiorna il mio modello all'interno del controllore sto usando UpdateModel come di seguito:

Account accountToUpdate = userSession.GetCurrentUser(); 
UpdateModel(accountToUpdate); 

Tuttavia ho bisogno di ottenere in qualche modo i valori dalla stringa di nuovo in oggetti.

Credo che possa avere qualcosa a che fare con i raccoglitori di modelli, ma non riesco a trovare alcun buon esempio chiaro di come farlo.

Grazie !! Paul

risposta

3

Hai ragione che un legatore di modelli è la strada da percorrere. Prova questo ...

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

[ModelBinder(typeof(MyViewModelBinder))] 
public class MyViewModel { 
    .... 
} 

public class MyViewModelBinder : DefaultModelBinder { 
    protected override void SetProperty(ControllerContext context, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value) { 
     if (propertyDescriptor.Name == "Genres") { 
      var arrVals = ((string[])value)[0].Split(','); 
      base.SetProperty(context, bindingContext, propertyDescriptor, new List<string>(arrVals)); 
     } 
     else 
      base.SetProperty(context, bindingContext, propertyDescriptor, value); 
    } 
} 
0

Check out Phil Haacks blog post sull'argomento. L'ho usato come base per una vista multipla fortemente tipizzata in un progetto recente.

+0

Il post di Haack riguarda la lista di oggetti vincolanti, non le caselle di elenco ... –