Razor:如何从 IEnumerable<string> ViewBag 属性 创建下拉菜单?

Razor: How to create a dropdown out of an IEnumerable<string> ViewBag property?

我有以下渲染视图:

 public ActionResult CreateAlta()
        {
            ViewBag.RolesApp = new SQLRolerecord().GetAllRolesInApp();
            return View();
        }

如何从 ViewBag 属性 RolesApp 生成下拉菜单? GetAllRolesInApp() returns 和 IEnumerable<string> 我的尝试如下:

<div class="form-group">
     <label class="col-sm-2 control-label">Role: </label>
          <div class="col-sm-4">
            @Html.DropDownListFor("iroleeid", ViewBag.RolesApp, "--Select Role of User--");
          </div>
</div>

但是这会产生一个错误,指出 DropDownListFor 在 HtmlHelper 中不存在。

谢谢。

您正在尝试使用 DropDownListFor,但这需要您有一个视图模型和一个附加到它的 属性(使用 lambda)。我认为您正在寻找 DropDownList

@Html.DropDownList("iroleeid",
                new SelectList(ViewBag.RolesApp),
                "--Select Role of User--",
                new { @class = "form-control" })

将您的 IENumerable<Role> 转换为 SelectList

控制器:

var selectList = new SqlRoleRecord().GetAllRolesInApp().Select(x => new SelectListItem { Value = x.Id, Text = x.Name }).ToList();
ViewBag.RolesApp = selectList;

查看:

@Html.DropDownListFor(x => x.SelectedRoleId, ViewBag.RolesApp, Model.SelectedRoleId)

可选:

当您添加 属性 用于将 SelectedRoleId 存储到您的模型时,您可以稍后在您的控制器中使用它。例如,当您确实需要将角色绑定到数据库中的用户时很有用。


P.S。不确定是否 100% 工作,目前无法编译。

您可以将字符串列表转换为 SelectListItem 的列表

var roles = new SQLRolerecord().GetAllRolesInApp()
                               .Select(f=>new SelectListItem { Value=f, Text = f}).ToList();
ViewBag.Roles= roles ;

现在在您看来,您可以使用 DropDownList 辅助方法。

@Html.DropDownList("Roles")

这将生成一个 select 元素,其中 nameid 属性 值设置为 "Roles"。如果您希望它们具有不同的名称,请使用此重载。

@Html.DropDownList("SelectedRole",ViewBag.Roles as List<SelectListItem>)

这将创建一个名称和 ID 属性 值设置为 "SelectedRole"

的下拉列表

由于我们将 SelectListItem 对象的值和文本设置为相同的字符串值,因此您的 select 元素选项值和文本将相同