ViewBag 在创建 MultiSelectList 时的奇怪之处

Posted

技术标签:

【中文标题】ViewBag 在创建 MultiSelectList 时的奇怪之处【英文标题】:ViewBag oddity in creating a MultiSelectList 【发布时间】:2012-01-29 09:44:10 【问题描述】:

我花了很多时间在各种论坛上寻找有关 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.OrdersViewBag.OrdersListBox 中没有任何作用,也没有在视图中使用,但是当我简单地为它分配一个值而不是第二行代码时有效。

这对任何人都有意义吗?关于如何通过向 GetPermissionList 发送一个字符串数组而不是向其传递 ViewBag 对象来创建一种简单地正常工作的方法的任何建议?

【问题讨论】:

如果你在链接之后设置断点 ViewBag.OrdersListBox = GetPermissionList(securityroles.Orders.Split(','));它有价值吗?在拆分的末尾添加一个 ToArray() 怎么样。只是在黑暗中拍摄 我尝试添加 ToArray(),同样的问题没有选择任何值。我还在建议的行添加了一个断点,并且传递的值是正确的。我只是无法理解为什么删除第一个 ViewBag 对象不起作用的逻辑。 【参考方案1】:

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

Multiselect with ViewModel

【讨论】:

以上是关于ViewBag 在创建 MultiSelectList 时的奇怪之处的主要内容,如果未能解决你的问题,请参考以下文章

C#/ Asp.NET:在ViewData / ViewBag中设置数据是否有利于每个请求与调用操作方法获取数据?

ViewBag 未在混合 Webforms/MVC 项目中声明

如何在 AJAX 成功中访问 viewbag 值?

简述viewdata,viewbag和tempdata的区别

怎么在js中,访问viewbag,viewdata等等的值

当前上下文中不存在名称“ViewBag”