1

尝试使用标准 ASP.Net 成员资格提供程序为所有可用角色获取一组复选框。我可以成功地将角色放入单个选择下拉列表中,但不能在我的一生中将它们放入一组复选框中。我已经知道如何创建角色、删除角色,但看不到如何在创建新用户帐户期间创建多选下拉列表或一组复选框。请注意:我不是在问如何处理表单提交时检查哪些复选框,我相信一旦我得到它,我就已经涵盖了。

无论如何,这就是我现在所拥有的,从模型和视图模型开始,然后是 CreatUser.cshtml

如您所见,我采用了局部视图的路线,以便它会呈现每个项目的复选框,但我只得到一个空的,如名称,ID,一切都是空的,此时复选框。

角色视图模型.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;

namespace JustAdminIt.ViewModels
{
    public class RoleViewModel
    {
        public string RoleName { get; set; }
        public bool Selected { get; set; }
    }
}

AllRolesViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;

namespace JustAdminIt.ViewModels
{
    public class AllRolesViewModel
    {
        public IEnumerable<RoleViewModel> Roles { get; set; }
    }


}

AccountModel.cs - 注册模型

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

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email address")]
    public string Email { 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; }

    [Display(Name = "Available Roles")]
    public AllRolesViewModel listRoles { get; set; }

}

创建用户.cshtml

 @model JustAdminIt.Models.RegisterModel

@{
    ViewBag.Title = "Register";
    //var roleDrop = ViewData["roleName"];
}

<h2>Create a New Account</h2>
<p>
    Use the form below to create a new account. 
</p>
<p>
    Passwords are required to be a minimum of @Membership.MinRequiredPasswordLength characters in length.<br /><br />
    Passwords are required to contain at least @Membership.MinRequiredNonAlphanumericCharacters Non-Alpha-Numeric characters.
</p>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true, "Account creation was unsuccessful. Please correct the errors and try again.")
    <div>
        <fieldset>
            <legend>Account Information</legend>

            <div class="editor-label">
                @Html.LabelFor(m => m.UserName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.UserName)
                @Html.ValidationMessageFor(m => m.UserName)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.Email)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Email)
                @Html.ValidationMessageFor(m => m.Email)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.Password)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.Password)
                @Html.ValidationMessageFor(m => m.Password)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.ConfirmPassword)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.ConfirmPassword)
                @Html.ValidationMessageFor(m => m.ConfirmPassword)
            </div>
            <div class="editor-label">
                Choose User Role(s)
            </div>
            <div class="editor-field">
                @foreach(var role in Model.listRoles.Roles)
                {
                    @Html.Label(role.RoleName)
                    @Html.CheckBox(role.RoleName, role.Selected)
                }
            </div>
            <p>
                <input type="submit" value="Register" />
            </p>
        </fieldset>
    </div>
}

编辑澄清

我只需要在新用户帐户创建页面 CreateUser.cshtml 上生成一组复选框,以便管理员可以在帐户创建期间分配一个或多个角色。

这里没有什么特别的,但唯一可以找到的示例是创建角色下拉列表,这不是此应用程序的选项。

我找不到使用 Roles.getAllRoles() 枚举的 Membership 提供程序的方法,因为该函数只返回角色的字符串数组。我尝试了多种方式等,但在列出可用角色时无济于事。

http://msdn.microsoft.com/en-us/library/system.web.security.roles.getallroles.aspx 供参考。我不知道获得所有可用角色的另一种方法。

为了澄清上下文 - RoleViewModel.cs 和 AllRolesViewModel.cs 用于在角色管理页面上列出所有系统角色 - 使用部分,它在那里工作得很好,但是复选框组和 html 帮助器的性质决定了不同的实现,这是我无法弄清楚的。

编辑更新的代码片段

现在列出的代码片段是当前使用的。现在的主要错误是 CreateUser.cshtml 上的整个模型为空,不确定原因。取得了进展,但仍然无法为所有可用角色显示一组复选框。

4

1 回答 1

0

我只得到一个空的,如名称,ID,一切都是空的,此时复选框。

您看到一个空白复选框的原因是因为您正在渲染一个带有空RoleViewModel实例的局部视图。

// This line passes an empty view model...probably not the desired behavior
Html.RenderPartial("_userRoles", new JustAdminIt.ViewModels.RoleViewModel());

鉴于当前的结构,我会AllRolesViewModel向您添加一个属性RegisterModel,然后使用foreach. 在里面foreach你可以做任何你想做的事情,比如创建一个局部视图,直接创建复选框等。

foreach( var role in Model.AllRolesViewModel.Roles ){
    @Html.CheckBoxFor( role => role.Selected, role.RoleName )
}

更进一步,AllRolesViewModel如果视图模型仅包含角色集合,我不确定为什么需要视图模型。您可能可以将这些角色移动到主视图模型并省略中介。

修改 RegisterModel

RegisterModel 是内置的 ASP.Net Memebership 提供程序,并且没有在任何地方显式声明 - 我如何将 AllRolesViewModel 添加到其中

我相信您正在使用 MVC3 脚手架附带的自动生成的类(参见屏幕截图)。即使您使用的是 ASP.Net 成员资格提供程序,您也可以自由修改此类。

在此处输入图像描述

于 2012-08-15T04:31:35.623 回答