DropDownListFor() 请帮忙
DropDownListFor() help please
我已经用这个 HTML Helper 放屁了一段时间,遵循各种理论上可以达到相同最终结果的例子。但是,我似乎无法产生最终结果...
也许有人可以在我返回使用 foreach 迭代出 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>
您的代码
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
属性,但您随后尝试绑定到 Role
属性 的 UserViewModel
而不是 RoleId
属性。因为 Role
的值与其中一个选项值不匹配,所以下拉列表中的第一个选项将始终被选中(因为必须选择)。
将您视图中的代码更改为
@Html.DropDownListFor(model => model.RoleId, Model.Roles, null, new { @class = "form-control" })
如果 RoleId
的值与其中一个选项值相匹配,那么它将被选中。
旁注:您的视图模型中的 Role
属性 似乎没有必要,因为需要在查询中创建与 Roles
table 的连接。
我已经用这个 HTML Helper 放屁了一段时间,遵循各种理论上可以达到相同最终结果的例子。但是,我似乎无法产生最终结果...
也许有人可以在我返回使用 foreach 迭代出 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>
您的代码
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
属性,但您随后尝试绑定到 Role
属性 的 UserViewModel
而不是 RoleId
属性。因为 Role
的值与其中一个选项值不匹配,所以下拉列表中的第一个选项将始终被选中(因为必须选择)。
将您视图中的代码更改为
@Html.DropDownListFor(model => model.RoleId, Model.Roles, null, new { @class = "form-control" })
如果 RoleId
的值与其中一个选项值相匹配,那么它将被选中。
旁注:您的视图模型中的 Role
属性 似乎没有必要,因为需要在查询中创建与 Roles
table 的连接。