MVC 3:在ASP成员角色“Manager”中填充用户的下拉列表

时间:2011-10-12 20:06:36

标签: asp.net-mvc-3 razor

所以,我正在我的应用程序中实现ASP成员资格和角色管理。我还有第二个用户表,其中包含所有非会员相关信息。我将电子邮件设置为Membership中的用户名,并将其设置为User表中的外键。

我正在自定义注册页面以包含下拉列表,以便在创建帐户时选择管理员。通过查找具有角色“Manager”的所有成员资格用户,然后创建外键与结果匹配的用户集合,生成管理器列表。

List<string> managerNames = new List<string>(Roles.GetUsersInRole("Manager"));
var managers = from m in _db.Users where managerNames.Contains(m.Email) select m;
ViewBag.managers = managers;

现在我必须使用该用户集合来填充我的视图中的下拉列表,其中Name属性设置为“ManagerID”(以匹配我的RegistrationModel),每个选项的值设置为User的主键,以及显示用户模型的DisplayName的下拉列表中显示的文本。

我可以完成循环遍历“管理器”集合并填充单独的SelectListItem,然后将SelectListItem传递给@Html.DropDown("ManagerID", newSelectListItem)的繁琐任务,但这似乎过多了。是否有更直接(或可接受)的方式来做到这一点?

修改

我将此添加到我的控制器

    var selectList = new List<SelectListItem>();
    foreach (var manager in managers)
        {
            selectList.Add(new SelectListItem(){
                Value = manager.UserID.ToString(),
                Text = manager.DisplayName,
                Selected = false
            });
        }
        ViewBag.managers = selectList;

这是我的观点

@Html.DropDownList("ManagerID", (List<SelectListItem>)ViewBag.managers)

它有效。这仍然是最好的方法吗?

1 个答案:

答案 0 :(得分:4)

  

这仍然是最好的方法吗?

没有。最好的方法是使用视图模型并忘记ViewBag / ViewData的存在。首先,设计一个满足视图要求的视图模型(显示经理的ddl):

public class MyViewModel
{
    [Required]
    public int? SelectedManagerId { get; set; }
    public IEnumerable<SelectListItem> Managers { get; set; }
}

然后让您的控制器操作填充此视图模型并将其传递给视图:

public ActionResult Foo()
{        
    var managers = ... query your repository to get them
    var model = new MyViewModel
    {
        Managers = managers.Select(x => new SelectListItem
        {
            Value = x.UserID.ToString(),
            Text = x.DisplayName
        })
    };
    return View(model);
}

最后在你的强类型视图中:

@model MyViewModel
...
@Html.DropDownListFor(
    x => x.SelectedManagerId, 
    Model.Managers, 
    "-- Select a manager --"
)

因此,每次在ASP.NET MVC应用程序中使用ViewBag / ViewData时,警报都会响起,告诉您有更好的方法。