有什么办法可以说我的视图模型属性应该呈现为DropDownList
(这样我可以指定DropDownList
项)?ASP.NET MVC内置支持DropDownList编辑器模板
我发现了很多自定义实现,但我想应该有一个内置的方式来实现这样一个基本的东西。
更新。我被Html.EditorForModel
方法渲染我的模型,我不想使用像Html.DropDownListFor
有什么办法可以说我的视图模型属性应该呈现为DropDownList
(这样我可以指定DropDownList
项)?ASP.NET MVC内置支持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)
)
和覆盖对象类型的默认模板,以允许深潜正如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>
}
}
方法,您可以使用HTML辅助DropDownList的建立你的下拉列表,但模型对象应该是inumerable 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)
请大家看问题的更新 – SiberianGuy 2012-07-16 05:27:23
是什么DropDownViewModel控制器,是ItemViewModel? – mmssaann 2013-07-16 05:12:15
这不显示我的下拉列表。它正在播放文本框中的项目。可能是我在使用DropDownViewModel控制器中做错了什么。我在这里找不到这门课。你可以提供建议吗? – mmssaann 2013-07-16 05:18:25
明白了,这是命名问题。我也必须为editortemplate文件命名为“ItemViewModel”。 – mmssaann 2013-07-16 05:20:43