使用Roles.GetUsers.InRole(“MyRole”)时,SelectListItem不会填充,但如果我使用Membership.GetAllUsers()则填充

时间:2012-03-09 14:05:41

标签: asp.net-mvc entity-framework razor asp.net-membership roles

我遇到需要使用以下代码填充下拉列表的情况。我通过设置在一种情况下使用此代码(并按预期获得所有用户的列表):

var users = Membership.GetAllUsers();

但如果我使用

var users = Roles.GetUsersInRole("MyRole");

我的下拉列表不会填充任何用户(我确定我的用户已列出所列用的角色)。

我是否需要将控制器更改为使用“MemberShipUser”以外的其他类型?

我是否需要以完全不同的方式处理这种情况,因为我使用的是角色而不是用户列表?

这是我的代码 -

控制器:

var users = Roles.GetUsersInRole("MyRole");
var model = new CreateStudentViewModel
{
    Users = users.OfType<MembershipUser>().Select(x => new SelectListItem
    {
        Value = x.UserName,
        Text = x.UserName,
    })
};

视图模型:

public class MyViewModel
{
    [Display(Name = "selected user")]
    public string SelectedUser { get; set; }
    public IEnumerable<SelectListItem> Users { get; set; }
}

查看:

    <div class="editor-label">
        @Html.LabelFor(model => model.SelectedUser)
    </div>

    <div class="editor-field">
        @Html.LabelFor(x => x.SelectedUser)
        @Html.DropDownListFor(x => x.SelectedUser, Model.Users)
    </div>

2 个答案:

答案 0 :(得分:1)

Roles.GetUsersInRole("MyRole")返回string[]而不是MembershipUser的列表。

users.OfType<MembershipUser>()为您提供空枚举。

在调用方法之前检查方法返回类型,或RTM; - )

答案 1 :(得分:0)

尝试:

@Html.DropDownList("SelectedUsers", new SelectList((IEnumerable<SelectListItem>)ViewData["Users"], "Id", "Name"))

控制器中的位置:

ViewData["Users"] = Roles.GetUsersInRole("MyRole");