我已经和这个HTML助手在一起玩了一段时间了,下面的例子在理论上实现了相同的结果。然而,我似乎不能产生最终结果.
也许有人会发现我做错了什么,然后再用前瞻迭代出select选项。最好能锁定这个助手的工作方式,这比使用foreach()的select代码更少。提前谢谢。
编辑控制器;
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>发布于 2015-09-19 23:33:14
你的代码
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时,可以将值设置为Role的Id属性,但随后尝试绑定到UserViewModel的Role属性,而不是RoleId属性。由于Role的值将与其中一个选项值不匹配,因此将始终选择下拉列表中的第一个选项(因为必须选择某些选项)。
将视图中的代码更改为
@Html.DropDownListFor(model => model.RoleId, Model.Roles, null, new { @class = "form-control" })如果RoleId的值与其中一个选项值相匹配,那么它将被选中。
附带注意:您的视图模型中的Role属性似乎没有必要,在查询中创建到Roles表的连接也是不必要的。
https://stackoverflow.com/questions/32673811
复制相似问题