C# 在Razor视图上保存未知数量的相同下拉列表
我遵循了Steve Sanderson的“编辑可变长度列表,ASP.NET MVC 2样式”指南,创建了一个MVC视图来编辑项目列表。注意,我使用的是MVC3,所以我不确定是否有更好的方法来实现这一点 我的问题是列表中的一个字段是下拉列表。我已经设法在每一行上填充了下拉列表,但是当页面加载时,它没有加载所选的值。不过,它正在保存所选值,但每次编辑页面时,我都需要重新设置所有下拉列表 有人知道如何为局部视图上的每个“行”设置选定的下拉列表值吗 我的编辑视图已更改C# 在Razor视图上保存未知数量的相同下拉列表,c#,asp.net-mvc,asp.net-mvc-3,razor,C#,Asp.net Mvc,Asp.net Mvc 3,Razor,我遵循了Steve Sanderson的“编辑可变长度列表,ASP.NET MVC 2样式”指南,创建了一个MVC视图来编辑项目列表。注意,我使用的是MVC3,所以我不确定是否有更好的方法来实现这一点 我的问题是列表中的一个字段是下拉列表。我已经设法在每一行上填充了下拉列表,但是当页面加载时,它没有加载所选的值。不过,它正在保存所选值,但每次编辑页面时,我都需要重新设置所有下拉列表 有人知道如何为局部视图上的每个“行”设置选定的下拉列表值吗 我的编辑视图已更改 @foreach (var ite
@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");
我看不到您的代码中有任何地方可以设置
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)
现在只剩下自定义相应的选项了。我找到了一个解决方法:您应该在局部视图中创建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)
}
我也有同样的问题,解决不了