有没有办法说我的视图模型属性应该呈现为DropDownList
(这样我可以指定DropDownList
个项目)?
我发现了很多自定义实现,但我想应该有一种内置的方法来实现这样一个基本的东西。
更新。我正在使用Html.EditorForModel
方法渲染我的模型,我不想使用像Html.DropDownListFor
这样的方法
答案 0 :(得分:14)
没有内置模板可以呈现下拉列表,但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类型的默认模板,以便允许 Deep Dive ,如Brad Wilson在his 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>
}
}
答案 1 :(得分:1)
您可以使用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")
如果您不想将Model对象构建为SelectListItem,那么您应该使用DropDownListFor
//you can use DropDownListFor as
@Html.DropDownListFor(m=>m.Text,m.Value)