3

ユーザーロール用のチェックボックスがいくつかある新しいユーザーを追加するフォームがあります。私のアクションには、次のプロパティを持つ User というモデルがあります。

public string Username { get; set; }
public string Password { get; set; }
public IEnumerable<UserRole> Roles { get; set; }

UserRole クラス内には、次の 2 つのプロパティがあります。

public int Id { get; set; }
public string Name { get; set; }

私のフォームでは、入力名「ユーザー名」と「パスワード」を指定することで、ユーザー名とパスワードに問題なくバインドできます。ページが最初に読み込まれると、ユーザー ロールの詳細が読み込まれるため、返す必要があるのは Id だけです。これは、サービスがユーザーをユーザー ロールに関連付けるために必要なものだからです。

各チェックボックスにロール Id の値を指定し、それを Roles に渡して、ロール クラスを部分的に完成させ、ロール オブジェクトの Name フィールドを空白のままにするという簡単な方法でこれを行うことができると思いました。チェックボックスの例は次のようになります。

<input type="checkbox" id="addUserAdministrator" name="Roles.Id" value="@Model.Roles.Where(role => role.Name == "Administrator").Select(role => role.Id).First()" class="css-checkbox"/>

ただし、これによって Roles コレクションが設定されることはなく、常に null です。これを行う方法はありますか、それとも int のリストを渡し、アクションでモデルを作成するという長い方法を実行する必要がありますか?

編集:

私のアクションは次のようになります。

public RedirectToRouteResult Add(User user)
4

2 に答える 2

3

プリミティブ型のコレクションをバインドできます-あなたの場合はint

 public IList<Int> Roles { get; set; } //role id's here

使用して

<input type="checkbox" id="addUserAdministrator" name="Roles"

または、Roles コレクションが必要な場合は、コレクションへのインデックスを明示的に指定する必要があります。この記事を読んでください。フォームのリストで選択した項目間にギャップがある場合は、非順次インデックス (たとえば、Guid.NewGuid() を使用) を使用することをお勧めします。

<input type="hidden" name="Roles.Index" value="@(GuidIndexForThisRow)" />
<input type="checkbox" name="Roles[@(GuidIndexForThisRow)].Id" value="1" />
于 2013-04-10T15:40:12.797 に答える