2010-02-08 14 views
5

Me pregunto dónde están creando las personas su lista selectiva, en la acción o en la vista.ASP.net MVC: ¿Crear lista de selección en la vista o acción?

He visto ejemplos de ambos y el que tiene más sentido para mí es hacerlo en la acción y hacer que el modelo de vista tenga una propiedad de tipo SelectList.

Por otro lado, he visto ejemplos donde las personas tienen el modelo de vista tienen una propiedad de SelectList y la lista de selección se rellena dentro del modelo de vista (ya sea en el constructor o mediante carga diferida). Me gusta esta idea, ya que significa que hay menos código en mis acciones ...

En resumen, me preguntaba qué personas están haciendo atm.

Saludos Anthony

Respuesta

5

Cree su SelectList en el controlador (por buscar la lista de elementos de su repositorio de modelos), y pasarlo a la vista, ya sea como un objeto ViewData, o como parte de su fuerza-mecanografiado ViewModel.

+0

¿Por qué? Me encantaría volver a votar si proporciona más detalles sobre por qué cree que este enfoque es preferible. ¿Es más fácil de probar? Promover la reutilización del código Mejor separación de preocupaciones? –

+0

@Seth: el objetivo de un objeto ViewModel fuertemente tipificado es empaquetar todos los datos requeridos por una vista para poder representarlos correctamente. En este caso, como un menú desplegable requiere una lista de elementos, es apropiado incluirlo en el objeto ViewModel. El programador que me sigue verá la lista de selección en el modelo de vista y concluirá que se está utilizando para completar un menú desplegable en la vista. Y él no tiene que buscar en ningún otro lado. –

+0

@Robert: estoy completamente de acuerdo contigo.Mi punto fue que su respuesta fue seleccionada como la "correcta", y pensé que podría ser útil alguna información adicional para alguien que se encuentre con esta pregunta en el futuro. Prefiero que los nuevos programadores MVC sepan _por qué_ esto es preferible, en lugar de seguir ciegamente una respuesta SO :) –

1

Normalmente, creo mi lista de selección en la capa de acción o servicio y la paso a mi vista a través de ViewData. También lo hice parte de un modelo de vista y una vista fuertemente tipada. Ambas formas lo crean en la capa de acción o servicio.

+0

Pasar listas de selección a través de ViewData está bien, pero si su página está fuertemente tipada a un objeto ViewModel, es más limpio solo incluir sus listas de selección como parte del ViewModel. –

+0

estuvo de acuerdo, y eso es lo que hago si necesito enviar más datos a la vista que solo la lista de selección. Si todo lo que necesito es una lista de selección, entonces tiendo a usar ViewDat a. –

1

Tengo la lista de selección expuesta como una propiedad en el modelo de vista y la rellene en la acción utilizando el repositorio necesario. Creo que el código que interactúa directamente con los repositorios debe ser el que también sea responsable de rellenar, ya sea las acciones del controlador o la capa de servicio o lo que sea.

No creo que completar la lista directamente desde el modelo de vista es una buena idea, porque requeriría que el modelo de vista tenga una dependencia del repositorio e interacciones con la base de datos y el modelo de vista no debería ser responsable de este tipo de cosas.

También podría crear un objeto especial por separado, llamado Inicializador o algo así, que haga todas las rellenado e inicializaciones, si tiene múltiples campos SelectList y desea mantener su código de acciones más limpio.

+0

"No creo que sea una buena idea rellenar la lista directamente desde el modelo de vista, porque requeriría que el modelo de vista tenga una dependencia de repositorio" - No necesariamente. El modelo de vista se rellena en el controlador (incluida la lista de elementos necesarios para la lista de selección), por lo que no se requiere dependencia del repositorio en el propio modelo de vista. –

+0

Ese era exactamente mi punto. El código de llenado del repositorio debe invocarse desde el controlador, no desde el código del modelo de vista (el constructor u otro método). – Victor

2

Es un aspecto específico de la presentación, por lo que prefiero hacerlo en la Vista, utilizando un ayudante Html. Así que paso una colección a la Vista y uso un método html helper para asignar los elementos a SelectListItems. El método podría verse muy parecido a esto:

public static IList<SelectListItem> MapToSelectItems<T>(this IEnumerable<T> itemsToMap, Func<T, string> textProperty, Func<T, string> valueProperty, Predicate<T> isSelected) 
{ 
    var result = new List<SelectListItem>(); 

    foreach (var item in itemsToMap) 
    { 
     result.Add(new SelectListItem 
     { 
      Value = valueProperty(item), 
      Text = textProperty(item), 
      Selected = isSelected(item) 
     }); 
    } 
    return result; 
} 

Saludos.

+0

Aún tiene que crear una lista de elementos en su ViewModel, entonces ¿por qué no simplemente hacer una lista selectiva? –

+0

Tiene razón, estaba pensando en el modelo como una entidad o un dto traducido de una entidad (no como modelo específico de la vista o ViewModel), de todos modos, podría usar el método anterior para realizar la traducción. – uvita

+0

Creo que los modelos específicos de vista probablemente deberían exponer una Lista de selección directamente, ya que reduce la cantidad de código que tiene que escribir en la vista, aunque sea solo un poco. Pero en algunos casos paso un DTO o un objeto comercial a una vista, y en esos casos llamaré a un ayudante como se muestra arriba [el mío se llama .ToSelectList()] de la vista. Creo que ambos enfoques son apropiados en diferentes escenarios. –

Cuestiones relacionadas