2010-11-20 25 views
10

Me preguntaba cuál es la mejor práctica al llenar listas desplegables usadas comúnmente en ASP.NET MVC. Por ejemplo, tengo una selección de país y estado que se usa a menudo en mi aplicación. Parece sucio poblar el modelo de vista y vincularlo a ese modelo de vista desde mi controlador para cada vista que quiera contener tal lista desplegable.ASP.NET MVC - Completar listas desplegables de uso común

¿Cómo pueblan las personas sus listas desplegables en tales casos? - Base de clase personalizada con esto cocido al horno? Clases de ayudantes, etc.

Gracias de antemano,

JP

Respuesta

7

Puede tener un atributo RequiresStateList para inyectar esa funcionalidad común a las acciones que lo necesitan.

public class RequiresStateList : ActionFilterAttribute { 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["StateList"] = GetStates(); 
    } 
} 

Y su acción

[RequiresStateList] 
public ActionResult Index() { 
    return View(); 
} 

Ahora usted puede conseguir que la lista de la ViewData en su opinión.

+0

No sé por qué no pensé en esto - una solución elegante y reutilizable. ¡Gracias! –

+0

@JP, De nada :) –

+1

En broma, ¡declaro que esto viola el Principio de Trueno! – Merritt

3

HTML personalizado Ayudantes es el camino a seguir ...

http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs

+0

Muy elegante: ni el modelo ni la vista están hinchados. El * código * en la vista es elegante y reutilizable. El HtmlHelper puede probarse por separado. –

+0

Me gusta esta solución por tenerlos en los modelos. Prefiero mantener mis modelos con los datos que se están rellenando/enviando, que en este caso sería el valor seleccionado, no la lista completa de valores. También son útiles para permitir que sus plantillas de vista obtengan la propiedad 'Text' de un valor seleccionado para las plantillas de DispalyFor (es decir, busque la propiedad Text donde la propiedad Value coincida con el valor seleccionado). –

+0

La extensión de HTML Helpers con DAL rompe la arquitectura de MVC, ya que tendrá sus vistas llamando a la capa de datos en lugar de simplemente ser un maniquí. Aunque romper la arquitectura MVC no es necesariamente algo malo. – Yorro

0

Soy un gran fan de la creación de modelos de vista que coinciden (modelo) cada vista exactamente. Entonces, si tiene una vista con una lista desplegable de Estados, mi modelo de vista para esa página tendría una colección de Estados de ListItems.

No me preocuparía tener modelos de vista con una colección de estados en él. En su lugar me gustaría centralizar la lógica para obtener los estados, algo así como:

viewModel.States = StatesHelper.GetStates(); // returns IList<ListItem> 
+0

hay un argumento interesante sobre este enfoque aquí: http://mikehadlow.blogspot.com/2010/10/populating-drop-down-lists-in-aspnet.html – Merritt

Cuestiones relacionadas