Asp.net mvc 为什么DropDownListFor在提交后丢失了多个选择,而ListBoxFor没有';T

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

我已经阅读了许多关于使用MultiSelectList的文章,但还不了解我的DropDownList for出了什么问题。我有一个ListBoxFor,具有相同的视图、ViewModel和数据,运行良好。我想使用DropDownListFor,因为它的optionLabel参数ListBoxFor没有

首次加载视图时,DropDownListFor和ListBoxFor都会显示多个选定项目

单击Submit按钮时,selected items集合被发回控制器action OK,视图被刷新,ListBoxFor仍显示两个selected items,但DropDownListFor仅显示一个selected items

控制器操作正在构建多选择列表,如下所示:

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" };

我们非常感谢这种透彻而博学的回应。谢谢。这是一个很好的深入的回答。很有见地,谢谢,描述得很好。