1

最终解决方案:

public class UpdateUser
{
    public IEnumerable<string> SelectedRoles { get; set; }
    public IEnumerable<SelectListItem> DropDownRoles { get; set; }
}

...

var roles = context.Roles.Select(x => x.RoleName).ToList();
UpdateUser userToUpdate = new UpdateUser
{
    SelectedRoles = user.Roles.Select(x => x.RoleName),
    DropDownRoles = new SelectList(roles, user.Roles)
};

HTML

@Html.ListBoxFor(x => x.SelectedRoles, Model.DropDownRoles)

==========================

我有一个下拉列表来显示用户角色,如下所示:

HTML

    @Html.TextBoxFor(x => x.Roles)
    @Html.DropDownList( "roles", ViewData["roles"] as SelectList)

控制器

var user = context.Users.Include(x => x.Roles).Where(x => x.UserId == id).FirstOrDefault();
ViewData["roles"] = new SelectList(context.Roles, "RoleId", "RoleName");

问题是我不知道如何在下拉菜单中设置选定的值。我想也许我可以使用 Lambda 表达式将匹配的角色放在列表的顶部,然后按字母顺序排列其余的角色。

        var roles = context.Roles
            .ToList()
            .OrderBy( ? matching role then other selectable roles ?)

必须是更简单的方法吗?

4

3 回答 3

4

不要使用与 ViewData 键和下拉列表的选定值相同的值。试试这样:

@Html.DropDownList("selectedRole", ViewData["roles"] as SelectList)

然后您的 POST 控制器操作可以将此作为参数:

[HttpPost]
public ActionResult Index(string selectedRole)
{
    ...
}

如果您的表单中有其他字段,您可以将它们分组到视图模型中:

public class MyViewModel
{
    public string SelectedRole { get; set; }
    public string SomeOtherField { get; set; }
}

然后让您的控制器操作将此视图模型作为参数。现在你有了一个视图模型,让我们充分利用它并摆脱可怕的弱类型ViewData

public class MyViewModel
{
    public string SelectedRole { get; set; }
    public IEnumerable<SelectListItem> Roles { get; set; }

    public string SomeOtherField { get; set; }
    public string YetAnotherField { get; set; }
}

然后您可以让 GET 操作填充此视图模型:

public ActionResult Index()
{
    var model = new MyViewModel();
    model.Roles = new SelectList(context.Roles, "RoleId", "RoleName");
    return View(model);
}

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    ...
}

然后您的视图可以被强输入到视图模型:

@model MyViewModel
@using (Html.BeginForm())
{
    ...
    @Html.DropDownListFor(x => x.SelectedRole, Model.Roles)
    ...
    <button type="submit">OK</button>
}
于 2013-02-19T09:04:01.023 回答
1

达林的回答是完整而清晰的,它对我的​​搜索有所帮助。但是,我只需要为强类型视图再添加一个。在我的项目中,我为特定用户填充了具有特定角色的 SelectList。这些角色已存储在数据库中。编辑(更改包括此角色在内的用户属性)时,我希望将最初配置的角色显示为所选值。

为此,只需通过调整视图的另一件事来完成 Darin 他的答案(我省略了我自己的模型,但它几乎与您从示例中得出的相同):

model MyViewModel
@using (Html.BeginForm())
{
    ...
    @{
      var selectedItem = Model.Roles.Where(role => role.Value.AsInt().Equals(...).FirstOrDefault();
      var selectedText = selectedItem != null ? selectedItem.Text : null; 
      Html.DropDownListFor(x => x.SelectedRole, Model.Roles, selectedText)
    }

    ...
    <button type="submit">OK</button>
}

如此处所述, selectedText 被视为optionLabel 它将始终将当前选定的值放在下拉列表中。

也许有点晚了,但我确实希望它可以帮助其他人:)

于 2013-09-11T10:21:07.910 回答
0

SelectList包含一个对象列表,SelectListItem每个对象都有一个Selected属性。因此,您可以执行以下操作:

var user = context.Users.Include(x => x.Roles).Where(x => x.UserId == id).FirstOrDefault();
var temp = new SelectList(context.Roles, "RoleId", "RoleName");
temp.First(x => x.Value.Equals(IdOfSelectedObject)).Selected = true;
ViewData["roles"] = temp;
于 2013-02-19T09:04:31.193 回答