所以,我正在我的应用程序中实现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)
它有效。这仍然是最好的方法吗?
答案 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时,警报都会响起,告诉您有更好的方法。