asp.net MVC3 の MultiSelectLists に関するヘルプを求めて、さまざまなフォーラムを精査するのに多くの時間を費やしました。最後に、私の問題を解決する方法を見つけたので、コードを削減しようとしていますが、ViewBags で奇妙なことに遭遇しました。最初にコード、動作を説明します。
コントローラーが使用する MultiSelectList を作成する関数
public MultiSelectList GetPermissionList(string[] selectedValues)
{
List<SelectListItem> permissions = new List<SelectListItem>()
{
new SelectListItem{ Value = "", Text = "None"},
new SelectListItem{ Value = "View", Text = "View"},
new SelectListItem{ Value = "Add", Text = "Add"},
new SelectListItem{ Value = "Edit", Text = "Edit"},
new SelectListItem{ Value = "Delete", Text = "Delete"}
};
return new MultiSelectList(permissions, "Value", "Text", selectedValues);
}
コントローラーからの編集アクションからの部分的なコード
public ActionResult Edit(int id)
{
ViewBag.Title = "Edit a Security Role";
SecurityRoles securityroles = Repository.Details(id);
ViewBag.Orders = securityroles.Orders.Split(',');
ViewBag.OrdersListBox = GetPermissionList(ViewBag.Orders);
return View(securityroles);
}
ビューからの部分的なコード
<td class="rightAlign topAlign editor-label">
@Html.MyLabel(m => m.Orders, "lblOrders")
</td>
<td class="editor-field">
@Html.ListBoxFor(m => m.Orders, ViewBag.OrdersListBox as MultiSelectList, new { size = "5" })
</td>
edit アクションからコードの大部分を切り取ったことに注意してください。このセキュリティ ロール マネージャー用に作成しているリスト ボックスは約 9 個です。
編集アクションでの私の目標は、現在持っているリストボックスごとに 2 行ではなく、GetPermissionListを呼び出してビューバッグに戻すだけの 1 行のコードを作成することです。
コードを見るだけで、次のように呼び出しを行うかどうかは明らかです。
ViewBag.OrdersListBox = GetPermissionList(securityroles.Orders.Split(','));
動作するはずですが、選択した値が反映されません。奇妙さを増すために、ここに私が試した別のことがありますが、うまくいきましたが、その理由はわかりません.
ViewBag.Orders = securityroles.Orders.Split(',');
ViewBag.OrdersListBox = GetPermissionList(securityroles.Orders.Split(','));
ViewBag.OrdersはViewBag.OrdersListBoxでは役割を果たしておらず、ビューでも使用されていませんが、コードの 2 行目よりも単純に値を割り当てると機能します。
これは誰にとっても意味がありますか?ViewBag オブジェクトを渡す代わりに文字列配列を送信することで、 GetPermissionListが正しく機能する方法を作成する方法について何か提案はありますか?