从数据库中的表生成下拉列表

时间:2013-06-14 12:32:02

标签: asp.net-mvc-4 drop-down-menu model controller html.dropdownlistfor

我试着更准确地回答我之前可以在这里找到的问题,我得到了一些不错的答案,但在我的情况下无法弄清楚如何使用它Previous question 我得到了一些不错的答案,但无法弄清楚如何在我的情况下使用它。

基本上我想拥有包含

的注册页面
  1. Email //来自我的AspNetUser(datamodel)类,数据库中也存在AspNetUsers表。
  2. UserName //来自我的AspNetUser(datamodel)类,数据库中也存在AspNetUsers表。
  3. Password //来自我的AspNetUser(datamodel)类,数据库中也存在AspNetUsers表。
  4. Role // dropdownlist,来自Role(datamodel)类,数据库中也存在Roles表
  5. 在我的控制器中,我以下列方式强化了我的Register方法:

    public class AccountController : Controller
        {
            //private readonly IDbContext dbContext;
            //
            // GET: /Account/
            [HttpGet]
            public ActionResult Login()
            {
                return View();
            }
    
            [HttpPost]
            [AllowAnonymous]
            public ActionResult Login(LoginModel model)
            {
                if(Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    return RedirectToAction("Index", "Home");
                }
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
                return View(model);
            }
    
            [HttpGet]
            public ActionResult Register()
            {
                string [] roles = Roles.GetAllRoles();
                return View(roles);
            }
    
            [HttpPost]
            public ActionResult Register(AspNetUser model)
            {
    
                return View();
            }
        }
    

    在我的get方法中,我正在传递roles进行查看,现在我正在使用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("Login", "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 no how to generate dropdownlist)
    
            <button class="btn btn-large btn-primary" type="submit">Sign In</button>
        }
    </div>
    

    你可以告诉我如何获得dropdownlist以及如何将所选值传递给控制器​​以使用它以便我可以在注册期间将用户置于角色中?为注册创建新模型会更好吗?

    编辑:AspNetUser模型

      public class AspNetUser
        {
            private ICollection<Role> _roles= new Collection<Role>();
            public Guid Id { get; set; }
    
            [Required]
            public virtual String Username { get; set; }
    
            public virtual String Email { get; set; }
    
            [Required, DataType(DataType.Password)]
            public virtual String Password { get; set; }
    
            public virtual String FirstName { get; set; }
            public virtual String LastName { get; set; }
    
            [DataType(DataType.MultilineText)]
            public virtual String Comment { get; set; }
    
            public virtual Boolean IsApproved { get; set; }
            public virtual int PasswordFailuresSinceLastSuccess { get; set; }
            public virtual DateTime? LastPasswordFailureDate { get; set; }
            public virtual DateTime? LastActivityDate { get; set; }
            public virtual DateTime? LastLockoutDate { get; set; }
            public virtual DateTime? LastLoginDate { get; set; }
            public virtual String ConfirmationToken { get; set; }
            public virtual DateTime? CreateDate { get; set; }
            public virtual Boolean IsLockedOut { get; set; }
            public virtual DateTime? LastPasswordChangedDate { get; set; }
            public virtual String PasswordVerificationToken { get; set; }
            public virtual DateTime? PasswordVerificationTokenExpirationDate { get; set; }
    
            public virtual ICollection<Role> Roles
            {
                get { return _roles; }
                set { _roles = value; }
            }
    
        }
    

1 个答案:

答案 0 :(得分:2)

您最好拥有专为此视图设计的视图模型。想一想您在视图中需要哪些信息并定义您的视图模型:

public class RegisterViewModel
{
    public string Email { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string SelectedRole { get; set; }
    public IEnumerable<SelectListItem> Roles { get; set; }
}

从这个视图模型中可以看出,为了有一个下拉列表,你需要2个属性:一个标量属性将保存所选值,一个集合属性保存可用值列表。

然后:

public ActionResult Register()
{
    string [] roles = Roles.GetAllRoles();
    var model = new RegisterViewModel();
    model.Roles = roles.Select(r => new SelectListItem 
    {
        Value = r,
        Text = r,
    });
    return View(model);
}

[HttpPost]
public ActionResult Register(RegisterViewModel model)
{
    // the model.SelectedRole will contain the selected value from the dropdown
    // here you could perform the necessary operations in order to create your user
    // based on the information stored in the view model that is passed

    // NOTE: the model.Roles property will always be null because in HTML,
    // a <select> element is only sending the selected value and not the entire list.
    // So if you intend to redisplay the same view here instead of redirecting
    // makes sure you populate this Roles collection property the same way we did 
    // in the GET action

    return Content("Thanks for registering");
}

最后是相应的观点:

@model RegisterViewModel
@{
    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("Login", "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(model => model.SelectedRole, Model.Roles)
        </div>

        <button class="btn btn-large btn-primary" type="submit">Sign In</button>
    }
</div>