1

標準の ASP.Net メンバーシップ プロバイダーを使用して、利用可能なすべてのロールのチェックボックスのグループを取得しようとしています。ロールを単一の選択ドロップリストに正常に入れることはできますが、私の人生では、それらをチェックボックスのグループに入れることはできません。ロールを作成する方法、一般的にロールを削除する方法は既にありますが、新しいユーザー アカウントの作成時に選択する複数選択ドロップ リストまたはチェックボックスのグループを作成する方法がわかりません。注: フォームの送信時にどのチェックボックスがチェックされているかを処理する方法を尋ねているわけではありません。

いずれにせよ、これが私がこの時点で持っているものです。Models と ViewModels から始めて、次に CreatUser.cshtml に進みます。

ご覧のとおり、各アイテムのチェックボックスをレンダリングするように部分ビューのルートを取りましたが、名前、ID、すべてが空のチェックボックスのように、この時点で空になっているのは 1 つだけです。

RoleViewModel.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 - RegisterModel

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; }

}

CreateUser.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>
}

明確にするために編集

管理者がアカウントの作成中に 1 つ以上のロールを割り当てることができるように、新しいユーザー アカウント作成ページ CreateUser.cshtml でチェックボックスのグループを生成する必要があるだけです。

ここには特別なものはありませんが、ロールのドロップリストを作成する例だけが見つかります。これは、このアプリケーションのオプションではありません。

Roles.getAllRoles() を使用してメンバーシップ プロバイダーを使用して列挙する方法が見つかりません。その関数は単純にロールの文字列配列を返すためです。私はそれをさまざまな方法でキャストしようとしましたが、利用可能な役割をリストするのに役に立ちませんでした。

http://msdn.microsoft.com/en-us/library/system.web.security.roles.getallroles.aspx を参照してください。すべての役割を利用可能にする別の方法を知りません。

コンテキストを明確にするために - RoleViewModel.cs と AllRolesViewModel.cs を使用して、ロール管理ページにすべてのシステム ロールを一覧表示します - パーシャルを使用すると、そこではうまく機能しますが、チェックボックス グループと html ヘルパーの性質により、別の実装が必要になります。 、そしてそれは私が理解できないものです。

更新されたコード スニペットの編集

現在リストされているコード スニペットは、現在使用されているものです。現在の主なエラーは、CreateUser.cshtml のモデル全体が null であり、理由がわからないことです。進捗はありますが、使用可能なすべてのロールに対して表示するチェックボックスのグループをまだ取得できません。

4

1 に答える 1

0

この時点で、名前、ID、すべてが空のチェックボックスのように、空になっているのは 1 つだけです。

RoleViewModel空白のチェックボックスが 1 つ表示されているのは、空のインスタンスが渡された単一の部分ビューをレンダリングしているためです。

// 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 メンバーシップ プロバイダーであり、どこにも明示的に宣言されていません - AllRolesViewModel をそれに追加するにはどうすればよいですか

MVC3 スキャフォールディングに付属する自動生成されたクラスを使用していると思います (スクリーンショットを参照)。ASP.Net メンバーシップ プロバイダーを使用している場合でも、このクラスを自由に変更できます。

ここに画像の説明を入力

于 2012-08-15T04:31:35.623 に答える