2011-07-19 11 views
5

Estoy usando MVC3 con vistas Razor y me gustaría construir DropDownLists reutilizables para varias de mis clases, pero después de mucha búsqueda no he encontrado un ejemplo que funcione exactamente como lo necesito. ..Plantilla de editor reutilizable con DropDownList para objetos comerciales

para este ejemplo tengo dos clases de este tipo: -

public class Person 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public Group Group { get; set; } 
} 

public class Group 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

tengo un controlador/Ver trabajando para persona. La vista tiene un control DropDownListFor:

@model Person 

... 

@Html.DropDownListFor(o => o.Group.ID, (ViewData["groups"] as SelectList)) 

la vista utiliza la clase Persona directa, no un modelo de intermediario, ya que no he encontrado una razón de peso para un resumen de la otra en esta etapa.

Lo anterior funciona bien ... en el controlador tomo el valor de Group.ID en la Persona devuelta desde la vista, lo busco y configuro Person.Group para el resultado. Funciona, pero no es ideal

He encontrado una carpeta aquí: MVC DropDownList values posted to model aren't bound que me resolverá esto, pero aún no lo he conseguido ... ya que realmente me parece útil si puedo reutilizarlo.

Lo que me gustaría hacer es tener algo como esto en una plantilla: -

@model Group 

@Html.DropDownListFor(o => o.Group.ID, (ViewData["groups"] as SelectList)) 

y utilizarlo en una vista como esta: -

@Html.EditorFor(o => o.Group) 

No obstante lo anterior doesn' Parece que funciona ... el editor de arriba para la línea inserta editores para toda la clase (por ejemplo, un cuadro de texto para Group.Description también) ... en lugar de insertar un DropDownList con mis grupos enumerados

Tengo el t arriba En un archivo llamado Group.cshtml en Vistas/Compartidas/EditorTemplates

Si esto funcionó, cada vez que una clase tenga una propiedad de tipo Grupo, este editor DropDownList se usaría por defecto (o al menos si se especifica con algún atributo))

Gracias de antemano por cualquier consejo proporcionado ...

Respuesta

6

puede crear un menú desplegable de la lista de control de usuario para manejar esto. Debajo de su carpeta compartida, cree una carpeta llamada EditorTemplates y coloque allí su control de usuario. MVC, por convención, busca en SharedTemplates plantillas para cualquier plantilla de editor. Puede anular dónde busca las plantillas de editor, pero no voy a entrar aquí.

Una vez que haya creado su control de usuario, tendrá que decorar la propiedad adecuada con el atributo "UIHint" para decirle al motor qué editor debe usar para esa propiedad.

Lo que sigue sería una implementación de muestra.

En la carpeta Shared/EditorTemplates, su control de usuario (_GroupsDropDown.cshtml en este caso) se vería así:

@model Group 

@Html.DropDownListFor(o => o.ID, (ViewData["groups"] as SelectList)) 

Modificar la propiedad de grupo en la Persona de añadir el atributo UIHint de la siguiente manera:

**[UIHint("_GroupsDropDown")]** 
public Group Group { get; set; } 

En su controlador que se necesita

ViewData["groups"] = new SelectList(<YourGroupList>, "ID", "Name"); 

Una vez que tenga el código anterior, puede usar la sintaxis de EditorFor como desee.

Espero que esto ayude.

+2

Esta es una buena respuesta. Me gustaría agregar que puede decirle al 'EditorFor' dónde buscar plantillas (por ejemplo, si desea usar diferentes plantillas en una vista por bases de vista). Se ve así: '@ Html.EditorFor (x => x.Filters.SelectedImprintId," ~/Views/Books/EditorTemplates ", Model.Filters.ImprintItems)' –

Cuestiones relacionadas