Non c'è alcun modello integrato che rende un elenco a discesa, tranne che per il tipo di Nullable<bool>
che visualizza un elenco a discesa Not Set
, Yes
, No
ma presumo che non sia quello che stai chiedendo.
Quindi costruiamone uno. Come sempre si inizia con la definizione del modello di vista che rappresenterà una tendina contenente 2 strutture (uno per il valore selezionato e uno per i valori disponibili):
public class ItemViewModel
{
public string SelectedId { get; set; }
public IEnumerable<SelectListItem> Items { get; set; }
}
allora potremmo avere una vista modello standard con questa proprietà:
public class MyViewModel
{
public ItemViewModel Item { get; set; }
}
poi un controller che riempirà il modello di vista:
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);
}
}
e una corrispondente vista (~/Views/Home/Index.cshtml
):
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorForModel()
}
Ora tutto quello che resta è quello di definire un modello di editor personalizzato per il tipo di DropDownViewModel
(~/Views/Shared/EditorTemplates/DropDownViewModel.cshtml
):
@model DropDownViewModel
@Html.DropDownListFor(
x => x.SelectedId,
new SelectList(Model.Items, "Value", "Text", Model.SelectedId)
)
e sovrascrivere il modello predefinito per il tipo di oggetto, al fine di consentire Deep Dive come spiega Brad Wilson in his blog post
. Altrimenti, per impostazione predefinita, ASP.NET MVC non ricercherà in sottotipi complessi per i modelli. Così sovrascriviamo ~/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>
}
}
ciò che è DropDownViewModel nel controller, è ItemViewModel? – mmssaann
Questo non sta visualizzando il menu a discesa per me. sta giocando è voce in caselle di testo. Posso essere sto facendo qualcosa di sbagliato nel controller con DropDownViewModel. Non riesco a trovare questa classe qui. puoi consigliarti? – mmssaann
Capito, è un problema di denominazione. Devo dare lo stesso nome che è "ItemViewModel" anche per il file editortemplate. – mmssaann