根据用户角色填充mvc下拉列表

时间:2014-04-23 10:10:50

标签: c# asp.net-mvc razor asp.net-mvc-viewmodel dropdownlistfor

我在我的MVC项目的视图中添加了一个下拉列表。将根据用户类型填充下拉列表;用户可以创建具有相同或较低访问级别的新用户。访问级别基于用户角色'在用户通过身份验证时分配。 例如,管理员具有最高的访问级别。他/她可以创建任何用户类型,即 管理员 经理 监 企业社会责任 只读 经理可以创建经理,主管等(等等。) 我有一个' Register'查看用户将在何处输入详细信息以创建新用户 - 用户名/密码和访问级别。下拉列表将为他们提供他们可以创建的用户类型列表。

我的问题是:我应该如何填充下拉列表? 我在控制器中有逻辑,我创建了下拉列表并将其传递给视图。但问题是,正如预期的那样 - 当注册'单击,下拉列表将丢失。 我可以在视图中创建下拉列表,但这是最好的'实践? 我的代码如下,以供参考;任何建议都非常感谢。

在ViewModel中:

public class RegisterViewModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    [Required]
    [Display(Name = "User type")]
    public IEnumerable<System.Web.Mvc.SelectListItem> UserType { get; set; }
}

查看:

 @Html.LabelFor(m => m.UserType, new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @Html.DropDownListFor(m => m.UserType, Model.UserType, new { @class = "form-control" })

在控制器中:

 public ActionResult Register()
    {
        CSR.Models.ViewModels.Account.RegisterViewModel rvm = new CSR.Models.ViewModels.Account.RegisterViewModel();
        rvm.UserType = GetRoles();
        return View(rvm);
    }

 private IEnumerable<SelectListItem> GetRoles()
    {
        var roles = RolesList().Select(x => new SelectListItem { Value = x.accessLevelID.ToString(), Text = x.accessLevel });
        return new SelectList(roles, "Value", "Text");
    }

RolesList()方法根据 User.IsInRole 返回用户列表。

我认为逻辑可能在视图中,所以每次都会填充下拉列表,但在我没有经验的意见中,这似乎违背了MVC&#39;图案。 建议非常感谢,谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用:

  1. 创建ActionFilter PopulateUserRoles(此过滤器添加到ViewData [Constants.UserTypes]项目集合,其中Constants.UserTypes是字符串常量“UserTypes”); example of such filter您可以在内部过滤所需的一切
  2. 按此属性装饰您的行动
  3. 结果:
    [PopulateUserRoles] public ActionResult Register()... ... @Html.DropDownListFor(x => x.UserType, ViewData[Constants.UserTypes]...
    此选项不需要控制器中的其他GetRoles()方法和viewmodel中的其他IEnumerable UserType属性。可以使用UIHint来改进此选项。