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
    ,它不了解
    角色。那么,如果我像在上面所示的控制器中那样传递角色,它在视图中是如何工作的呢