我花了很多时间在各种论坛上寻找有关 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>
请记住,我已经从编辑操作中删除了大量代码,我为这个安全角色管理器创建了大约 9 个列表框。
我的目标是在编辑操作中简单地拥有 1 行代码,调用GetPermissionList并将其返回到视图包,这样我就可以在视图中显示它,而不是我目前拥有的每个列表框 2 行。
只看代码,如果我以这种方式进行调用似乎很明显:
ViewBag.OrdersListBox = GetPermissionList(securityroles.Orders.Split(','));
它应该可以工作,但是选择的值没有通过。更奇怪的是,这是我尝试过的其他方法并且效果很好,但是为什么没有意义。
ViewBag.Orders = securityroles.Orders.Split(',');
ViewBag.OrdersListBox = GetPermissionList(securityroles.Orders.Split(','));
ViewBag.Orders在ViewBag.OrdersListBox中没有任何作用,也没有在视图中使用,但是当我简单地为它分配一个值时,第二行代码就起作用了。
这对任何人都有意义吗?关于如何通过向GetPermissionList发送一个字符串数组而不是向其传递 ViewBag 对象来创建一种简单地正常工作的方法的任何建议?