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 时,您将值设置为 RoleId 属性,但您随后尝试绑定到 Role 属性 的 UserViewModel 而不是 RoleId 属性。因为 Role 的值与其中一个选项值不匹配,所以下拉列表中的第一个选项将始终被选中(因为必须选择)。

将您视图中的代码更改为

@Html.DropDownListFor(model => model.RoleId, Model.Roles, null, new { @class = "form-control" })

如果 RoleId 的值与其中一个选项值相匹配,那么它将被选中。

旁注:您的视图模型中的 Role 属性 似乎没有必要,因为需要在查询中创建与 Roles table 的连接。