Asp.net mvc 4 从数据库中的值创建dropdownlist
我有一个名为Asp.net mvc 4 从数据库中的值创建dropdownlist,asp.net-mvc-4,drop-down-menu,Asp.net Mvc 4,Drop Down Menu,我有一个名为Roles的表,其中有三个字段 Guid RoleId string RoleName 字符串描述 在我的register.cshtml视图中,我希望有一个dropdownlist,其中显示角色表中的角色名列表。我还需要能够获得该值并使用它,比如将角色分配给用户,这将在controller中完成。 我的视图当前看起来像下面的视图,我使用的模型是AspNetUser,但它不了解角色,这正是我想在下拉列表中显示的内容。 @model Sorama.CustomAuthentiaction
Roles
的表,其中有三个字段
Guid RoleId
string RoleName
字符串描述
register.cshtml
视图中,我希望有一个dropdownlist
,其中显示角色表中的角色名列表。我还需要能够获得该值并使用它,比如将角色分配给用户,这将在controller中完成。
我的视图当前看起来像下面的视图,我使用的模型是AspNetUser
,但它不了解角色
,这正是我想在下拉列表中显示的内容。
@model Sorama.CustomAuthentiaction.Models.AspNetUser
@{
ViewBag.Title = "Register";
Layout = "~/Views/shared/_BootstrapLayout.empty.cshtml";
}
@section Styles{
<link href="@Url.Content("~/Content/bootstrap.css")" rel="stylesheet" type="text/css" />
}
<div class ="form-signin">
@using (Html.BeginForm("Register", "Account"))
{
@Html.ValidationSummary(true)
<h2 class="form-signin-heading"> Register </h2>
<div class ="input-block-level">@Html.TextBoxFor(model=>model.Email, new{@placeholder = "Email"})</div>
<div class ="input-block-level">@Html.TextBoxFor(model=>model.UserName, new{@placeholder = "UserName"})</div>
<div class ="input-block-level">@Html.PasswordFor(model=>model.Password, new{@placeholder ="Password"})</div>
<div class ="input-block-level">@Html.DropDownListFor(//don't know what to do
<button class="btn btn-large btn-primary" type="submit">Register</button>
}
</div>
我需要做什么,才能拥有下拉列表?在控制器中,您需要以某种方式将表示角色的字符串[]
(IEnumerable
)传递到视图中
有很多方法可以实现这一点,但在AccountController中,您可以执行以下操作:
public class AccountController : Controller
{
private IDbContext dbContext;
public AccountController(IDbContext dbContext)
{
// Made up field that defines your GetAllRoles method
this.dbContext = dbContext;
}
public ActionResult Register()
{
// Call the GetAllRoles() and capture the result in a variable called roles
var roles = dbContext.GetAllRoles();
return View(new AspNetUser {
Roles = roles
});
}
}
注意:我不强制列表在控制器中以任何形式存在(我不指定它应该是选择列表),我可能希望以不同的方式显示项目,我通过仅传递值并允许视图决定如何呈现值,使视图具有灵活性
在视图中,您可以在希望下拉列表显示的位置使用:
@Html.DropDownListFor(model => model.Roles, Model.Roles
.Select(role => new SelectListItem { Text = role, Value = role })
正如我提到的,有很多方法可以实现您想要的,但几乎有一件事是肯定的,即使用aspnet mvc时,您很可能会在此处使用Html助手DropDownListFor
MSDN文档:
编辑1:
创建一个模型来保存用户和角色信息,如下所示:
public class RegisterViewModel
{
public AspNetUser AspNetUser { get; set; }
public IEnumerable<string> Roles { get; set; }
}
在视图中,您需要更新模型以使用:
@model Sorama.CustomAuthentiaction.Models.RegisterViewModel
如果您不愿意/无法进行这样的更改,可以将角色列表添加到Viewbag:
或者正如你提到的:
ViewBag.RoleList = Roles.GetAllRoles();
然后在视图中访问,如下所示:
@Html.DropDownListFor(model => model.Roles, ViewBag.RoleList
.Select(role => new SelectListItem { Text = role, Value = role })
在控制器中,您需要将表示角色的字符串[]
(IEnumerable
)传递到视图中
有很多方法可以实现这一点,但在AccountController中,您可以执行以下操作:
public class AccountController : Controller
{
private IDbContext dbContext;
public AccountController(IDbContext dbContext)
{
// Made up field that defines your GetAllRoles method
this.dbContext = dbContext;
}
public ActionResult Register()
{
// Call the GetAllRoles() and capture the result in a variable called roles
var roles = dbContext.GetAllRoles();
return View(new AspNetUser {
Roles = roles
});
}
}
注意:我不强制列表在控制器中以任何形式存在(我不指定它应该是选择列表),我可能希望以不同的方式显示项目,我通过仅传递值并允许视图决定如何呈现值,使视图具有灵活性
在视图中,您可以在希望下拉列表显示的位置使用:
@Html.DropDownListFor(model => model.Roles, Model.Roles
.Select(role => new SelectListItem { Text = role, Value = role })
正如我提到的,有很多方法可以实现您想要的,但几乎有一件事是肯定的,即使用aspnet mvc时,您很可能会在此处使用Html助手DropDownListFor
MSDN文档:
编辑1:
创建一个模型来保存用户和角色信息,如下所示:
public class RegisterViewModel
{
public AspNetUser AspNetUser { get; set; }
public IEnumerable<string> Roles { get; set; }
}
在视图中,您需要更新模型以使用:
@model Sorama.CustomAuthentiaction.Models.RegisterViewModel
如果您不愿意/无法进行这样的更改,可以将角色列表添加到Viewbag:
或者正如你提到的:
ViewBag.RoleList = Roles.GetAllRoles();
然后在视图中访问,如下所示:
@Html.DropDownListFor(model => model.Roles, ViewBag.RoleList
.Select(role => new SelectListItem { Text = role, Value = role })
在类似的场景中,我做了如下操作:
private void BagSelectList()
{
ViewBag.List = new SelectList(
db.SetOfCandidateValues,
"KeyPropertyOfTheSet",
"NameOfThePropertyToAppearInTheDropDownList",
selectedValue);
}
并且认为:
@Html.DropDownListFor(
model => model.ForeignKeyProperty,
(SelectList)ViewBag.List)
(当然,如果您不喜欢ViewBag
,可以使用强类型视图模型来实现。)在类似的场景中,我做了如下操作:
private void BagSelectList()
{
ViewBag.List = new SelectList(
db.SetOfCandidateValues,
"KeyPropertyOfTheSet",
"NameOfThePropertyToAppearInTheDropDownList",
selectedValue);
}
并且认为:
@Html.DropDownListFor(
model => model.ForeignKeyProperty,
(SelectList)ViewBag.List)
(当然,如果您不喜欢ViewBag
,可以使用强类型视图模型来实现。)您能解释一下IDbContext类吗?我是否只需要添加一些名称空间来使用它?我需要为此创建一个类?这是一个虚构的接口,我添加了它,因为我不确定如何访问GetAllRoles()
方法。在我使用的mvc项目中,我让IOC()连接我的控制器,并为控制器提供它们所需的依赖项。我设想您将传递包含GetAllRoles()
方法的类。GetAllRoles()
是否在单独的类中传递给您的控制器?如果它在控制器中,而不是一个单独的类中,那么您不需要将参数传递给构造函数,但是我建议您考虑将它放入另一个类中,如果您还没有,这将帮助您使您的应用程序变得坚实()实际上我正在使用默认RoleProvider来获取我拥有的角色列表。所以,Roles.GetAllRoles()代码>为我获取所有角色,这是字符串数组。但在我看来,我使用的模型是aspnetuser
,它不了解角色。那么,如果我像在上面所示的控制器中那样传递角色,那么它将如何工作呢?在这种情况下,请参见编辑1您能解释一下IDbContext类吗?我是否只需要添加一些名称空间来使用它?我需要为此创建一个类?这是一个虚构的接口,我添加了它,因为我不确定如何访问GetAllRoles()
方法。在我使用的mvc项目中,我让IOC()连接我的控制器,并为控制器提供它们所需的依赖项。我设想您将传递包含GetAllRoles()
方法的类。GetAllRoles()
是否在单独的类中传递给您的控制器?如果它在控制器中,而不是一个单独的类中,那么您不需要将参数传递给构造函数,但是我建议您考虑将它放入另一个类中,如果您还没有,这将帮助您使您的应用程序变得坚实()实际上我正在使用默认RoleProvider来获取我拥有的角色列表。所以,Roles.GetAllRoles()代码>为我获取所有角色,这是字符串数组。但在我看来,我使用的模型是aspnetuser
,它不了解角色。那么,如果我像在上面所示的控制器中那样传递角色,它在视图中是如何工作的呢