ViewBag在创建MultiSelectList时很奇怪

时间:2011-12-28 18:49:20

标签: asp.net-mvc-3 multi-select viewbag html.listboxfor

我花了很多时间在各种论坛上寻求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个列表框。

我的目标,在编辑操作中只需要一行代码,调用 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对象来正常工作?

1 个答案:

答案 0 :(得分:1)

我认为,您必须设置订单,因为这是选择发生时所选值绑定的内容。如果你不想预先选择任何东西,你可以传递一个字符串[]。在这篇文章中查看Darin的答案。他正在使用模型,但我认为相同的概念适用于视图包。

Multiselect with ViewModel