在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");

在Razor视图上保存未知数量的相同下拉列表

我找到了一个解决方法:您应该在分部视图中创建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)

现在剩下的就是定制相应的编辑器模板了