以下に示す検索モデルクラスに強く型付けされた検索編集ビューがあります(簡略化)。
編集中の検索に起因するカストディアンを、現在選択されているすべてのカストディアンを表示するリストボックスに表示したいと思います。
したがって、私のコントローラーのGetEditアクションは次のようになります。
public ActionResult Edit(int id, int searchListId = 0)
{
if (searchListId != 0)
{
Session["CurrentSearchListID"] = searchListId;
}
ProjectContext mydb = db;
Search search = Search.Find(mydb, id);
IEnumerable<SelectListItem> selectedItems =
from c in Custodian.List(mydb)
select new SelectListItem
{
Selected = (search.Custodians.Contains(c)),
Text = c.CustodianName,
Value = c.ToString()
};
ViewBag.Custodians = selectedItems;
return View(search);
}
したがって、私のビューリストボックスは次のようになります。
@{
//List<Kiersted.Keps.BusinessObjects.Custodian> Custodians = ViewBag.Custodians;
IEnumerable<SelectListItem> SelectedItems = ViewBag.Custodians;
}
@Html.ListBox("Custodians", SelectedItems);
これにより、カストディアンが描かれたリストボックスが生成されますが、何も選択されていません(SelectListItemのいくつかが、選択されたカストディアンを正確に記述していることを確認しました。ListBoxForを使用してみましたが、MultiSelectListを入力すると同じものが生成されます。
最後に、私はそれが私が望むことをするように強制することに決めました、しかしこれは提出時に選択されたカストディアンを返しません。
<select id="Custodians" multiple="multiple" name="Custodians">
@foreach (Kiersted.Keps.BusinessObjects.Custodian cust in Custodians)
{
if (Model.Custodians.Contains(cust))
{
<option value="@cust.CustodianID" selected="selected">@cust.CustodianName</option>
}
else
{
<option value="@cust.CustodianID" >@cust.CustodianName</option>
}
}
</select>
誰かがあなたがこれを行うことになっている方法を知っていますか?
編集:
ListBoxたとえば
さて、しばらくそれをいじった後、リストボックスで検索カストディアンに対応するカストディアンが選択されました。以下はビューコードです。
<div class="editor-field">
@Html.ListBoxFor(model => model.Custodians, allCustodians.Select(cust => new SelectListItem {
Text = cust.CustodianName,
Value = cust.CustodianID.ToString(),
Selected = true}),
new { Multiple = "multiple" })
</div>
さらに複数のカストディアンを選択した場合、送信時にそれら(または対応する値)をコントロールに戻すにはどうすればよいですか?