UserとRoleという2つのクラスがあります。ユーザーはこんな感じ
class User{
...
public List<Role> Roles;
}
役割はこんな感じ
class Role{
...
public int ID;
public string Name;
}
今私はアクションを持っています(送信)
public IActionResult Submit(User user){
...
}
私のindex.cshtmlではselect
は
<select multiple="multiple" class="multi-select" id="my_multi_select1" asp-for="Roles" asp-items="ViewBag.Roles"></select>
およびViewBag.Roles
値は
ViewBag.Roles= new SelectList(Role.SelectAll(), "Name", "Name");
問題は、フォームを投稿すると、データが次のように送信されることです...&Roles=role1,role2&...
などuser.Rolesは、名前がrole1
およびrole2
そしてそれらをuser.Rolesに割り当てます(実際にはAspにそれをしてもらいたいです)
Select Tag Helper asp-forは、オブジェクトコレクションではなく、select要素のモデルプロパティ名を指定し、asp-itemsはオプション要素(SelectListItemのコレクション)を指定します。
1.ドロップダウンアイテムのプロパティとしてリストを含むViewModelを追加します。
public class UserViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public List<int> Roles { get; set; }
}
2.In.cshtmlファイルは以下のように選択します
@model PostMultiSelect.Models.UserViewModel
<select multiple="multiple" class="multi-select" id="my_multi_select1" asp-for="@Model.Roles" asp-items="(List<SelectListItem>)ViewBag.Roles"></select>
3.以下のようなViewBag.Rolesの値は、RoleIdでロールを取得します
ViewBag.Roles = _context.Roles.Select(r=>new SelectListItem { Value=r.ID.ToString(),Text=r.Name}).ToList();
名前の付いたロールを取得する場合は、「Value = r.ID.ToString() "」を「Value = r.Name"」に変更できます。