Asp.net mvc 为什么DropDownListFor在提交后丢失了多个选择,而ListBoxFor没有';T
我已经阅读了许多关于使用MultiSelectList的文章,但还不了解我的DropDownList for出了什么问题。我有一个ListBoxFor,具有相同的视图、ViewModel和数据,运行良好。我想使用DropDownListFor,因为它的optionLabel参数ListBoxFor没有 首次加载视图时,DropDownListFor和ListBoxFor都会显示多个选定项目 单击Submit按钮时,selected items集合被发回控制器action OK,视图被刷新,ListBoxFor仍显示两个selected items,但DropDownListFor仅显示一个selected items 控制器操作正在构建多选择列表,如下所示:Asp.net mvc 为什么DropDownListFor在提交后丢失了多个选择,而ListBoxFor没有';T,asp.net-mvc,asp.net-mvc-5.2,Asp.net Mvc,Asp.net Mvc 5.2,我已经阅读了许多关于使用MultiSelectList的文章,但还不了解我的DropDownList for出了什么问题。我有一个ListBoxFor,具有相同的视图、ViewModel和数据,运行良好。我想使用DropDownListFor,因为它的optionLabel参数ListBoxFor没有 首次加载视图时,DropDownListFor和ListBoxFor都会显示多个选定项目 单击Submit按钮时,selected items集合被发回控制器action OK,视图被刷新,Li
vm.TasksFilterGroup.Assignees = new MultiSelectList(employees, "Id", "FullName", new string[] { "51b6f06a-e04d-4f98-88ef-cd0cfa8a2757", "51b6f06a-e04d-4f98-88ef-cd0cfa8a2769" });
视图代码如下所示:
ListBoxFor
@Html.ListBoxFor(m=>m.TasksFilterGroup.SelectedAssignees,Model.TasksFilterGroup.Assignees,新{@class=“form control”,multiple=“multiple”})
下拉列表
@Html.DropDownListFor(m=>m.TasksFilterGroup.SelectedAssignees,Model.TasksFilterGroup.Assignees,new{@class=“form control”,multiple=“multiple”})
正如这些方法的名称所暗示的那样,DropDownListFor()
用于创建
(选择1个选项),而ListBoxFor()
用于创建
(选择多个选项)。虽然这两种方法共享许多公共代码,但它们确实会产生不同的结果
添加multiple=“multiple”
属性会更改显示,但不会更改这些方法执行的代码的功能
如果检查,您将注意到DropDownListFor()
的所有重载最终调用private static MvcHtmlString DropDownListHelper()
方法,类似地ListBoxFor()
最终调用private static MvcHtmlString ListBoxHelper()
方法
这两种方法都调用了private static MvcHtmlString SelectInternal()
方法,但区别在于dropdownlessalper()
传递allowMultiple=false
,而ListBoxHelper()
传递allowMultiple=true
在SelectInternal()
方法中,代码的关键行是
object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string));
然后在为
元素构建html时使用defaultValue
的值,并用于设置所选的属性
在ListBoxFor()
的情况下,defaultValue
的值将是由selectedassignes
属性定义的数组。在DropDownListFor()
的情况下,它返回null
,因为属性的值不能转换为string
(它是一个数组)
因为defaultValue
是null
,所以
元素中没有一个设置了所选的属性,因此会丢失模型绑定
作为旁注,如果在将模型传递到视图之前,要在GET方法中设置selectedassignes
的值,则在使用DropDownListFor()
时,由于上述相同的原因,将不会选择任何值
还请注意,生成选择列表的代码应为
vm.TasksFilterGroup.Assignees = new SelectList(employees, "Id", "FullName" });
使用DropDownListFor()
或ListBoxFor()
方法时,设置第三个参数没有意义,因为它是绑定到的属性(SelectedAssignees
)的值,决定了选择了哪些选项(第三个参数被方法忽略)。如果希望选择与那些Guid
值匹配的选项,则在GET方法中,使用
vm.TasksFilterGroup.SelectedAssignees= new string[]{ "51b6f06a-e04d-4f98-88ef-cd0cfa8a2757", "51b6f06a-e04d-4f98-88ef-cd0cfa8a2769" };
我们非常感谢这种透彻而博学的回应。谢谢。这是一个很好的深入的回答。很有见地,谢谢,描述得很好。