ASP.NETMVC。如何在 Partial 中插入 SelectList?
ASP.NET MVC. How insert a SelectList inside an Partial?
我想创建一个包含先前配置列表的 select 的部分。
在控制器中,我能够创建 SelectList
并将其添加到 ViewBag
。
但是,在控制器上定义的 ViewBag
不会传播到部分。 Partials 有自己的 ViewBag
例如这个 POCO 项目 class:
class MyItem{
[Key]
public int id {get;set;}
public int Forign_element_id {get;set;}
public string PropB {get;set;}
}
它的部分是这样的:
@model MyItem
@Html.HiddenFor(model => model.id)
@Html.LabelFor(model => model.PropA)
@Html.DropDownListFor(model => model.Forign_element_id, (SelectList)ViewBag.MySelectList)
//Error! ViewBag are not propageted to the EditorTemplate
@Html.LabelFor(model => model.PropB)
@Html.EditorFor(model => model.PropB)
重要。列表中的每个项目都有一个 Forign_element_id 值。此值必须在渲染时 select 编辑到 select 框中。
使用接受 additionalViewData
的 overloads 之一将 SelectList
作为对象传递。
在主视图中(假设您的模型有一个名为 MyProperty
的 属性,其类型为 MyItem
)
@Html.EditorFor(m => m.MyProperty, new { options = (SelectList)ViewBag.MySelectList })
并在您的 MyItem.cshtml
模板中
@Html.DropDownListFor(m => m.Forign_element_id, (SelectList)ViewData["options"])
在您的编辑器模板中试试这个:而不是 (Dictionary) 将它转换为您的类型;在我的例子中,我从调用层传递字典;所以我把它用作新的 SelectList(list, "Key", "Value"), 相应地改变
编辑器模板名称 - DropdownList
@{
var defaultText = (string)ViewData["DefaultText"];
//var list = (Dictionary<string, string>) ViewData["List"]; -- my List was Dictionary
var list = (List<YourType>) ViewData["List"];
}
@Html.DropDownListFor(model => model,
new SelectList(list, "Key", "Value"),
defaultText,
new { @class = "form- control", style="height: auto;width:90%" })
编辑 - 添加调用代码
@Html.EditorFor(model => model.YourModel, "DropdownList", new { List = ViewBag.YourList, DefaultText = "Select one item"})
其中 "DropdownList" 是编辑器模板名称
控制器:
private IEnumerable<SelectListItem> GetMyItemsSelectItems()
{
return (from s in _rep.GetMyItems()
select new SelectListItem
{
Text = s.MyItemName,
Value = s.ID.ToString()
}).AsEnumerable();
}
public ActionResult Create()
{
ViewBag.MyItems = GetMyItemsSelectItems();
return View(new MyItem { ID = 1, Forign_element_id = 2});
}
查看:
@model App.Models.MyItem
@Html.DropDownListFor(m => m.ID, new SelectList(ViewBag.MyItems,
"Value", "Text"))
@Html.DropDownListFor(m => m.Forign_element_id,
new SelectList(ViewBag.MyItems, "Value", "Text"))
我想创建一个包含先前配置列表的 select 的部分。
在控制器中,我能够创建 SelectList
并将其添加到 ViewBag
。
但是,在控制器上定义的 ViewBag
不会传播到部分。 Partials 有自己的 ViewBag
例如这个 POCO 项目 class:
class MyItem{
[Key]
public int id {get;set;}
public int Forign_element_id {get;set;}
public string PropB {get;set;}
}
它的部分是这样的:
@model MyItem
@Html.HiddenFor(model => model.id)
@Html.LabelFor(model => model.PropA)
@Html.DropDownListFor(model => model.Forign_element_id, (SelectList)ViewBag.MySelectList)
//Error! ViewBag are not propageted to the EditorTemplate
@Html.LabelFor(model => model.PropB)
@Html.EditorFor(model => model.PropB)
重要。列表中的每个项目都有一个 Forign_element_id 值。此值必须在渲染时 select 编辑到 select 框中。
使用接受 additionalViewData
的 overloads 之一将 SelectList
作为对象传递。
在主视图中(假设您的模型有一个名为 MyProperty
的 属性,其类型为 MyItem
)
@Html.EditorFor(m => m.MyProperty, new { options = (SelectList)ViewBag.MySelectList })
并在您的 MyItem.cshtml
模板中
@Html.DropDownListFor(m => m.Forign_element_id, (SelectList)ViewData["options"])
在您的编辑器模板中试试这个:而不是 (Dictionary) 将它转换为您的类型;在我的例子中,我从调用层传递字典;所以我把它用作新的 SelectList(list, "Key", "Value"), 相应地改变
编辑器模板名称 - DropdownList
@{
var defaultText = (string)ViewData["DefaultText"];
//var list = (Dictionary<string, string>) ViewData["List"]; -- my List was Dictionary
var list = (List<YourType>) ViewData["List"];
}
@Html.DropDownListFor(model => model,
new SelectList(list, "Key", "Value"),
defaultText,
new { @class = "form- control", style="height: auto;width:90%" })
编辑 - 添加调用代码
@Html.EditorFor(model => model.YourModel, "DropdownList", new { List = ViewBag.YourList, DefaultText = "Select one item"})
其中 "DropdownList" 是编辑器模板名称
控制器:
private IEnumerable<SelectListItem> GetMyItemsSelectItems()
{
return (from s in _rep.GetMyItems()
select new SelectListItem
{
Text = s.MyItemName,
Value = s.ID.ToString()
}).AsEnumerable();
}
public ActionResult Create()
{
ViewBag.MyItems = GetMyItemsSelectItems();
return View(new MyItem { ID = 1, Forign_element_id = 2});
}
查看:
@model App.Models.MyItem
@Html.DropDownListFor(m => m.ID, new SelectList(ViewBag.MyItems,
"Value", "Text"))
@Html.DropDownListFor(m => m.Forign_element_id,
new SelectList(ViewBag.MyItems, "Value", "Text"))