web-dev-qa-db-ja.com

複数選択リストをオブジェクトのリストに投稿するasp.netコア2

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にそれをしてもらいたいです)

3
Alireza Mn

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"」に変更できます。

5
Xueli Chen