そこで、AvailableServicesとSelectedServicesの 2 つの ListBox を含むビューを作成しました。
@Html.ListBoxFor(x => x.AvailableServices, Enumerable.Empty<SelectListItem>(), new { id = "serviceID" })
@Html.ValidationMessageFor(model => model.AvailableServices)
@Html.ListBoxFor(x => x.SelectedServices, Enumerable.Empty<SelectListItem>(), new { id = "selectedserviceID" })
@Html.ValidationMessageFor(model => model.SelectedServices)
参考までに、ここに私のViewModelがあります:
namespace Services.ViewModels
{
public class SPServiceTypeViewModel
{
public int Id { get; set; }
public int SPCompanyAccountID { get; set; }
[Display(Name = "Service Category")]
public IEnumerable<SelectListItem> ServiceCategory { get; set; }
[Display(Name = "Available Services")]
public IEnumerable<SelectListItem> AvailableServices { get; set; }
[Display(Name = "Your Services")]
public IEnumerable<SelectListItem> SelectedServices { get; set; }
}
}
私のコントローラーは、AvailableServices ListBox に問題なくデータを入力します。また、ユーザーが項目 ( idとlabelを含む) をAvailableServices ListBox からSelectedServicesリストボックスに移動できるようにする JavaScript をいくつか作成しました。そこも問題ありません。
ここに私の問題があります...さまざまな投稿を読みましたが、 IDとラベルの両方をキャプチャする必要があるため、フォーム送信時にSelectedServices ListBox からコントローラーにデータを戻す最良の方法をまだ理解していませんそれぞれの選択。
ここでの私の目標は、SPServiceTypeテーブルに、SelectedServices ListBox の各項目に対して新しいデータベース行を作成することですが、私にはわかりません。現在、データを保存するためのコントローラーは次のようになっています。
[HttpPost]
public ActionResult Create(SPServiceTypeViewModel viewModel)
{
foreach (var item in viewModel.SelectedServices)
{
var spServiceType = new SPServiceType
{
SPCompanyAccountId = viewModel.SPCompanyAccountID,
ServiceCategory = ???,
};
db.SPServiceType.Add(spServiceType);
db.SaveChanges();
return RedirectToAction("Create", "SPServiceLocation");
}
ViewModel で IEnumerable を使用する必要はありませんか? モデル バインディングを簡単に実行できるように、送信前にJavaScript を使用してSelectedServices値を非表示の List<> に渡す必要がありますか?
繰り返しますが、選択範囲のidとlabelの値を取得したいと思います。
ビュー内でこれにアプローチする方法に関するコード例、またはコントローラーの Post アクション、または一般的なアプローチのアドバイスをいただければ幸いです。