2012-07-16 13 views
8

¿Hay alguna manera de decir que la propiedad del modelo de vista se debe representar como DropDownList (para poder especificar DropDownList elementos)?Compatibilidad incorporada de ASP.NET MVC para la plantilla del editor DropDownList

He encontrado muchas implementaciones personalizadas, pero supongo que debería haber una forma integrada de implementar algo tan básico.

Actualización. estoy renderizado mi modelo por Html.EditorForModel método, no quiero utilizar métodos como Html.DropDownListFor

Respuesta

14

No hay ninguna plantilla integrada que hace una lista desplegable, excepto para el tipo Nullable<bool> cuales representa un menú desplegable de Not Set, Yes, No pero supongo que no es por lo que pregunta.

Así que construyamos uno. Como siempre empezamos por definir el modelo de vista que representará un menú desplegable que contiene 2 propiedades (una para el valor seleccionado y uno de los valores disponibles):

public class ItemViewModel 
{ 
    public string SelectedId { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

entonces podríamos tener una vista del modelo estándar con esta propiedad:

public class MyViewModel 
{ 
    public ItemViewModel Item { get; set; } 
} 

entonces un controlador que llenará la vista del modelo:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Item = new ItemViewModel 
      { 
       SelectedId = "2", 
       Items = new[] 
       { 
        new SelectListItem { Value = "1", Text = "item 1" }, 
        new SelectListItem { Value = "2", Text = "item 2" }, 
        new SelectListItem { Value = "3", Text = "item 3" }, 
       } 
      } 
     }; 
     return View(model); 
    } 
} 

y una vista correspondiente (~/Views/Home/Index.cshtml):

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.EditorForModel() 
} 

Ahora todo lo que queda es definir un editor de plantillas a medida para el tipo DropDownViewModel (~/Views/Shared/EditorTemplates/DropDownViewModel.cshtml):

@model DropDownViewModel 
@Html.DropDownListFor(
    x => x.SelectedId, 
    new SelectList(Model.Items, "Value", "Text", Model.SelectedId) 
) 

y anular la plantilla por defecto para el tipo de objetos con el fin de permitir que Deep Dive como Brad Wilson explica en his blog post. De lo contrario, por defecto ASP.NET MVC no se repetirá en subtipos complejos para sus plantillas. Así sobreescribimos ~/Views/Shared/EditorTemplates/Object.cshtml:

@foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) 
{ 
    if (prop.HideSurroundingHtml) 
    { 
     @Html.Editor(prop.PropertyName) 
    } 
    else 
    { 
     <div class="editor-label"> 
      @(prop.IsRequired ? "*" : "") 
      @Html.Label(prop.PropertyName) 
     </div> 
     <div class="editor-field"> 
      @Html.Editor(prop.PropertyName) 
      @Html.ValidationMessage(prop.PropertyName, "*") 
     </div> 
    } 
} 
+1

lo que es DropDownViewModel en el controlador, es ItemViewModel? – mmssaann

+0

Esto no muestra el menú desplegable para mí. está jugando es un elemento en cuadros de texto. Puede ser que estoy haciendo algo mal en el controlador con DropDownViewModel. No puedo encontrar esta clase aquí. ¿puedes aconsejar? – mmssaann

+1

Entendido, es un problema para nombrar. Debo dar el mismo nombre que es "ItemViewModel" para el archivo editortemplate también. – mmssaann

1

Se puede usar HTML ayudante DropDownList para construir su lista desplegable, pero el objeto del modelo de Down deben ser inumerable de SelectionListItem.

//on controller 
    List<SelectListItem> items = new List<SelectListItem>(); 
    items.Add(new SelectListItem { Text = "Action", Value = "0"}); 
    items.Add(new SelectListItem { Text = "Drama", Value = "1" }); 
    items.Add(new SelectListItem { Text = "Comedy", Value = "2", Selected = true }); 
    items.Add(new SelectListItem { Text = "Science Fiction", Value = "3" }); 
    ViewBag.MovieType = items; 

//on view 

     @Html.DropDownList("MovieType") 

Si no desea construir su objeto Modelo como SelectListItem, entonces debería usar DropDownListFor

//you can use DropDownListFor as 
@Html.DropDownListFor(m=>m.Text,m.Value) 
+0

Por favor, mire la pregunta de actualización – SiberianGuy

Cuestiones relacionadas