有什么办法可以说我的视图模型属性应该呈现为DropDownList
(以便我可以指定DropDownList
项目)?
我发现了很多自定义实现,但我想应该有一个内置的方法来实现这样一个基本的东西。
更新。我正在按Html.EditorForModel
方法渲染我的模型,我不想使用类似的方法Html.DropDownListFor
有什么办法可以说我的视图模型属性应该呈现为DropDownList
(以便我可以指定DropDownList
项目)?
我发现了很多自定义实现,但我想应该有一个内置的方法来实现这样一个基本的东西。
更新。我正在按Html.EditorForModel
方法渲染我的模型,我不想使用类似的方法Html.DropDownListFor
没有呈现下拉列表的内置模板,除了呈现, ,下拉列表的Nullable<bool>
类型,但我认为这不是你要问的。Not Set
Yes
No
所以让我们建立一个。与往常一样,我们首先定义视图模型,该模型将表示包含 2 个属性的下拉列表(一个用于选定值,一个用于可用值):
public class ItemViewModel
{
public string SelectedId { get; set; }
public IEnumerable<SelectListItem> Items { get; set; }
}
那么我们可以有一个具有这个属性的标准视图模型:
public class MyViewModel
{
public ItemViewModel Item { get; set; }
}
然后是一个将填充视图模型的控制器:
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);
}
}
和相应的视图 ( ~/Views/Home/Index.cshtml
):
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorForModel()
}
现在剩下的就是为DropDownViewModel
类型 ( ~/Views/Shared/EditorTemplates/DropDownViewModel.cshtml
) 定义一个自定义编辑器模板:
@model DropDownViewModel
@Html.DropDownListFor(
x => x.SelectedId,
new SelectList(Model.Items, "Value", "Text", Model.SelectedId)
)
并覆盖 Object 类型的默认模板,以便按照 Brad Wilson 在 中解释的那样进行Deep Divehis blog post
。否则,默认情况下 ASP.NET MVC 不会递归到您的模板的复杂子类型。所以我们覆盖~/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>
}
}
您可以使用 Html Helper DropDownList 来构建您的下拉列表,但模型对象应该是无法计数的 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")
如果您不想将模型对象构建为 SelectListItem,那么您应该使用 DropDownListFor
//you can use DropDownListFor as
@Html.DropDownListFor(m=>m.Text,m.Value)