5

Quando si dispone di un oggetto dominio che deve essere visualizzato come controllo di interfaccia, come un elenco a discesa, ifwdev suggerisce di creare un metodo di estensione per aggiungere un. ToSelectList().Come codificare un metodo di estensione C# per trasformare un oggetto modello di dominio in un oggetto di interfaccia?

L'oggetto di origine è un elenco di oggetti che hanno proprietà identiche alle proprietà .Text e .Value dell'elenco a discesa. Fondamentalmente, è un elenco di oggetti SelectList, ma non dello stesso nome di classe.

Immagino che si possa usare il reflection per trasformare l'oggetto dominio in un oggetto di interfaccia. Qualcuno ha qualche suggerimento per il codice C# che potrebbe fare questo? SelectList è un elenco a discesa MVC di SelectListItem.

L'idea, naturalmente, è quello di fare qualcosa di simile nella vista:

<%= Html.DropDownList("City", 
     (IEnumerable<SelectListItem>) ViewData["Cities"].ToSelectList()) 
+0

per riflessione, intendo leggere le proprietà dell'oggetto di origine e abbinarli alle proprietà SelectList, restituendo una corretta lista di selezione DropDownList. –

risposta

4

E 'più facile fare la parte del vostro SelectListViewModel oggetto.

In ogni caso, è sufficiente scorrere il numero IEnumerable e aggiungere ciascun elemento a un nuovo oggetto SelectList e restituirlo.

public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption) 
{ 
    var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList(); 
    items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" }); 
    return items; 
} 

How to refactor these 2 similar methods into one?

+2

+1 per avere i dati della lista di selezione formattata nel modello di vista. È molto più facile e molto più facile da testare. – Mark

+0

Se per favore, hai un collegamento per il modello ViewModel? Stiamo parlando di creare una classe per ogni vista oltre ai modelli di dominio? Supponevo che il repository non restituisse nessuno di questi, quindi usi le fabbriche per creare i modelli di visualizzazione? –

+1

Ecco qui: http://nerddinnerbook.s3.amazonaws.com/Part6.htm. ViewModel è un oggetto di classe che contiene tutti i dati necessari per il rendering della vista (compresi elementi come SelectLists). –

4

Questi sono i due metodi di estensione che uso per creare elenchi di selezione.

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value) 
{ 
    return collection.ToSelectList(text, value, x => false); 
} 

public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> collection, Func<T, string> text, Func<T, string> value, Func<T, bool> selected) 
{ 
    return (from item in collection 
      select new SelectListItem() 
         { 
          Text = text(item), 
          Value = value(item), 
          Selected = selected(item) 
         }); 
} 

HTHS,
Charles

Problemi correlati