DropDownListFor() 助手

问题描述 投票:0回答:1

我已经使用这个 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>
asp.net-mvc razor html-helper
1个回答
1
投票

您的代码

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
表的联接一样。

© www.soinside.com 2019 - 2024. All rights reserved.