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>
}
}
lo que es DropDownViewModel en el controlador, es ItemViewModel? – mmssaann
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
Entendido, es un problema para nombrar. Debo dar el mismo nombre que es "ItemViewModel" para el archivo editortemplate también. – mmssaann