5

Cuando tiene un objeto de dominio que necesita mostrarse como un control de interfaz, como una lista desplegable, ifwdev sugirió crear un método de extensión para agregar un .ToSelectList().Cómo codificar un método de extensión C# para convertir un objeto de Modelo de dominio en un objeto de interfaz?

El objeto de origen es una Lista de objetos que tienen propiedades idénticas a las propiedades .Text y .Value de la lista desplegable. Básicamente, es una lista de objetos SelectList, simplemente no del mismo nombre de clase.

Imagino que podría usar la reflexión para convertir el objeto de dominio en un objeto de interfaz. Alguien tiene alguna sugerencia para el código C# que podría hacer esto? SelectList es una lista desplegable MVC de SelectListItem.

La idea, por supuesto, es hacer algo como esto en la vista:

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

por la reflexión, me refiero a leer las propiedades del objeto de origen y coinciden con las propiedades selectlist, devolviendo una lista de selección DropDownList adecuada. –

Respuesta

4

Es más fácil hacer la parte SelectList de su objeto ViewModel.

De todos modos, solo tiene que recorrer el IEnumerable y agregar cada elemento a un nuevo objeto SelectList y devolverlo.

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 por tener los datos de la lista de selección formateada en el modelo de vista. Es mucho más fácil y mucho más fácil de probar. – Mark

+0

Si lo desea, ¿tiene un enlace para el patrón ViewModel? ¿Estamos hablando de hacer una clase para cada vista además de los modelos de dominio? Supongo que el repositorio no devolverá ninguno de estos, ¿entonces usas fábricas para crear los modelos de vista? –

+1

Aquí tienes: http://nerddinnerbook.s3.amazonaws.com/Part6.htm. ViewModel es un objeto de clase que contiene todos los datos que necesita para representar la vista (incluidos elementos como SelectLists). –

4

Estos son los dos métodos de extensión que utilizo para crear listas de selección.

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

Cuestiones relacionadas