あなたが使用しているアプローチは正しいです。常にビューモデルを使用し、ViewBag を使用しないことに同意します。
ビューモデルでは、辞書を MultiSelectList に変更して、選択した値も取得できるようにする必要があります。
public IList<int> PriorInsuranceCompaniesSelected { get; set; }
public MultiSelectList PriorInsuranceCompanies { get; set; }
次に、いくつかの Id が既に選択されている場合は最初のフィールド (たとえば、リポジトリからデータをロードするときに取得する情報) をマップし、2 番目のフィールドにはすべての値をマップします。
Get 部分のコントローラーから (例としていくつかのコード):
model.PriorInsuranceCompaniesSelected = new List<int>();
var companies = repository.GetPriorInsuranceCompanies();
//add to your PriorInsuranceCompaniesSelected the values already checked from your entity
var entity = repository.GetEntityBy(id);
if (entity.PriorInsuranceCompanies != null)
foreach (var item in entity.PriorInsuranceCompanies)
model.PriorInsuranceCompaniesSelected.Add(item.Id);
var select = (from s in companies select new { Id = s.Id, Name = s.Name }).OrderBy(x => x.Name); //.ToList;
model.PriorInsuranceCompanies = new MultiSelectList(select, "Id", "Name", model.PriorInsuranceCompaniesSelected);
次に、Htmlで次のような出力が得られます
@foreach (var item in Model.PriorInsuranceCompanies)
{
<label for="@item.Value" class="check">
<input type="checkbox" id="@item.Value" name="PriorInsuranceCompaniesSelected" value="@item.Value" @(item.Selected ? "checked" : "") />@item.Text</label>
}
投稿時に、ModelBinder は正しいオブジェクトをモデルに自動的にマップします。model.PriorInsuranceCompaniesSelected の値を確認するだけです。
[HttpPost]
public ActionResult MyForm(MyViewModel model)
{
if (ModelState.IsValid)
{
try
{
//your mapping code or whatever...
//You do your things with the selected ids..
if (model.PriorInsuranceCompaniesSelected != null && model.PriorInsuranceCompaniesSelected.Count > 0)
entity.PriorInsuranceCompanies = repository.GetCompaniesBy(model.PriorInsuranceCompaniesSelected);
else
entity.PriorInsuranceCompanies = new List<Comapny>();
repository.Save(entity);
return RedirectToAction("Index");
}
catch (RulesException ex)
{
ex.CopyTo(ModelState);
}
catch
{
ModelState.AddModelError("", "My generic error taken form a resource");
}
}
//rehydratates the list in case of errors
//....
return View(model);
}
これにより、何をすべきかがわかります。役立つことを願っています