我已经使用这个 HTML Helper 一段时间了,遵循了理论上实现相同最终结果的各种示例。但是,我似乎无法产生最终结果。
也许有人可以在我返回使用 foreach 迭代选择选项之前看到我做错了什么。最好能锁定这个助手的工作原理,比使用 foreach() 进行选择的代码更少。
编辑控制器:
public ActionResult Edit(string id)
{
if (id != "")
{
UserViewModel user = (from u in db.Users.Where(u => u.Id.Equals(id))
from ur in u.Roles
join r in db.Roles on ur.RoleId equals r.Id
select new UserViewModel
{
UserId = u.Id,
DisplayName = u.DisplayName,
Role = r.Name,
RoleId = r.Id
}
).FirstOrDefault();
//Select List items for select list
var roles = db.Roles.Select(r => new SelectListItem { Value = r.Id, Text = r.Name });
//select list with selected value
user.Roles = new SelectList(roles,"Value", "Text", user.RoleId);
return View(user);
}
return View();
}
查看;
<div class="form-group">
@Html.LabelFor(model => model.Role, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.Role, Model.Roles, null, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Role, "", new { @class = "text-danger" })
</div>
</div>
您的代码
var roles = db.Roles.Select(r => new SelectListItem { Value = r.Id, Text = r.Name });
创造
IEnumerable<SelectListItem>
。
user.Roles = new SelectList(roles,"Value", "Text", user.RoleId);
只是从中创建另一个相同的
IEnumerable<SelectListItem>
,因此它只是毫无意义的额外开销,并且由于您绑定到模型中的属性,所以最后一个参数(user.RoleId
)被忽略,也毫无意义
应该只是
user.Roles = db.Roles.Select(r => new SelectListItem { Value = r.Id, Text = r.Name });
当您创建此
SelectList
时,您将值设置为 Id
的 Role
属性,但随后尝试绑定到 Role
的 UserViewModel
属性而不是 RoleId
属性。由于 Role
的值与其中一个选项值不匹配,因此下拉列表中的第一个选项将始终被选择(因为必须选择某些选项)。
将视图中的代码更改为
@Html.DropDownListFor(model => model.RoleId, Model.Roles, null, new { @class = "form-control" })
如果
RoleId
的值与其中一个选项值匹配,则将选择该选项。
旁注:视图模型中的
Role
属性似乎没有必要,就像在查询中创建与 Roles
表的联接一样。