Nie ma wbudowany szablon, który czyni rozwijaną listę, z wyjątkiem typu Nullable<bool>
który renderuje listę rozwijaną Not Set
, Yes
, Yes
, ale zakładam, że nie o to pytasz.
Stwórzmy więc jeden. Jak zawsze zaczynamy od zdefiniowania widoku modelu, który będzie reprezentował rozwijaną zawierającą 2 nieruchomości (jedno dla wybranej wartości i jeden dla dostępnych wartości):
public class ItemViewModel
{
public string SelectedId { get; set; }
public IEnumerable<SelectListItem> Items { get; set; }
}
wtedy możemy mieć standardowy model widok z tej właściwości:
public class MyViewModel
{
public ItemViewModel Item { get; set; }
}
następnie sterownik, który wypełni widok modelu:
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);
}
}
i odpowiedni widok (~/Views/Home/Index.cshtml
)
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorForModel()
}
Teraz wszystko, co pozostało jest zdefiniowanie własnego szablonu edytora dla typu DropDownViewModel
(~/Views/Shared/EditorTemplates/DropDownViewModel.cshtml
):
@model DropDownViewModel
@Html.DropDownListFor(
x => x.SelectedId,
new SelectList(Model.Items, "Value", "Text", Model.SelectedId)
)
i zastąpić domyślny szablon dla danego typu obiektów w celu umożliwienia Deep Dive jak Brad Wilson wyjaśnia w his blog post
. W przeciwnym razie program ASP.NET MVC domyślnie nie będzie powracał do złożonych podtypów szablonów. Więc zastąpić ~/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>
}
}
co jest DropDownViewModel w sterowniku, czy to ItemViewModel? – mmssaann
To nie jest lista rozwijana dla mnie. to jest odtwarzanie w polach tekstowych. Być może robię coś złego w kontrolerze z DropDownViewModel. Nie mogę znaleźć tej klasy tutaj. czy możesz doradzić? – mmssaann
Mam to, nazywa się problem. Muszę nadać tę samą nazwę, która jest "ItemViewModel" również dla pliku editortemplate. – mmssaann