在Razor视图上保存未知数量的相同下拉列表
本文关键字:下拉列表 未知数 Razor 视图 保存 | 更新日期: 2023-09-27 18:04:25
我遵循了Steve Sanderson的"编辑可变长度列表,ASP。. NET MVC 2风格"的指南,并创建了一个MVC视图来编辑项目列表。请注意,我使用MVC 3,所以我不确定是否有更好的方法来做到这一点。http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/
问题是我的列表中的一个字段是下拉列表。我已经设法得到下拉菜单上的每一行填充,但它不加载所选的值时,页面加载。然而,它是保存选定的值,但每次我编辑页面时,我需要重新设置所有的下拉菜单。
有没有人知道如何设置每个"行"上的部分视图的选定下拉值?
编辑视图中有
@foreach (var item in Model.Roles)
{
@Html.Partial("RoleRow-Edit", item)
}
我的局部视图有
@using (Html.BeginCollectionItem("Roles"))
{
@Html.EditorFor(model => model.TemplateID)
@Html.DropDownList("PartyRoleID", (SelectList)ViewBag.PartyRoles)
@Html.EditorFor(model => model.DisplayName)
}
在我的控制器上我有
ViewBag.PartyRoles = new SelectList(db.PartyRoles.OrderBy(c => c.Role), "Role", "Role");
我找到了一个解决方法:您应该在分部视图中创建SelectList,并将其初始值设置为有界值,因此分部视图将看起来像这样:
@{var selectList = new SelectList(db.PartyRoles.OrderBy(c => c.Role),
"Role", "Role",Model.PartyRoleID);}
/*pass the db.PartyRoles.OrderBy(c => c.Role) in view bag inside controller,
it's cleaner*/
@using (Html.BeginCollectionItem("Roles"))
{
@Html.EditorFor(model => model.TemplateID)
@Html.DropDownList(model => model.PartyRoleID, selectList)
@Html.EditorFor(model => model.DisplayName)
}
我看不到代码中设置PartyRoleID
值的任何地方。我建议您使用视图模型和强类型视图,而不是ViewBag
:
@Html.DropDownListFor(x => x.PartyRoleID, Model.PartyRoles)
现在你要做的就是在控制器上设置视图模型的值:
var roles = db.PartyRoles.OrderBy(c => c.Role);
var model = new MyViewModel();
// preselect the value of the dropdown
// this value must correspond to one of the values inside the roles collection
model.PartyRoleID = "admin";
model.PartyRoles = new SelectList(roles, "Role", "Role");
return View(model);
我还建议您使用编辑器模板并替换以下foreach循环:
@foreach (var item in Model.Roles)
{
@Html.Partial("RoleRow-Edit", item)
}
@Html.EditorFor(x => x.Roles)
现在剩下的就是定制相应的编辑器模板了