asp.net-mvc – 为什么DropDownListFor会在提交后丢失多个选择,但ListBoxFor不会?
|
我已经阅读了很多关于使用MultiSelectList的文章,并且还没有理解我的DropDownListFor出了什么问题.我有一个ListBoxFor与相同的View,ViewModel和数据工作正常.我想使用DropDownListFor,因为它具有ListBoxFor没有的optionLabel参数. 首次加载View时,DropDownListFor和ListBoxFor都会显示多个选定的项目. 单击“提交”按钮时,所选项目集合将回发到Controller操作,并且视图将刷新,ListBoxFor仍显示两个选定项目,但DropDownListFor仅显示一个选定项目.
vm.TasksFilterGroup.Assignees = new MultiSelectList(employees,"Id","FullName",new string[] { "51b6f06a-e04d-4f98-88ef-cd0cfa8a2757","51b6f06a-e04d-4f98-88ef-cd0cfa8a2769" });
View代码如下所示: <div class="form-group">
<label>ListBoxFor</label>
@Html.ListBoxFor(m => m.TasksFilterGroup.SelectedAssignees,Model.TasksFilterGroup.Assignees,new { @class = "form-control",multiple = "multiple" })
</div>
<div class="form-group">
<label>DropDownListFor</label>
@Html.DropDownListFor(m => m.TasksFilterGroup.SelectedAssignees,multiple = "multiple" })
</div>
为什么DropDownListFor会在提交后丢失多个选择,但ListBoxFor却没有? 解决方法正如方法的名称所暗示的,DropDownListFor()用于创建< select> (选择1个选项)和ListBoxFor()用于创建< select multiple> (选择多个选项).虽然这两种方法共享许多通用代码,但它们确实会产生不同的结果.添加multiple =“multiple”属性会更改显示,但不会更改这些方法执行的代码的功能. 如果你检查source code,你会注意到DropDownListFor()的所有重载最终都会调用私有静态MvcHtmlString DropDownListHelper()方法,类似的ListBoxFor()最终会调用私有静态MvcHtmlString ListBoxHelper()方法. 这两个方法都调用私有静态MvcHtmlString SelectInternal()方法,但区别在于DropBownListHelper()传递allowMultiple = false,而ListBoxHelper()传递allowMultiple = true. 在SelectInternal()方法中,代码的关键行是 object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName,typeof(string[])) : htmlHelper.GetModelStateValue(fullName,typeof(string)); 然后在为< option>构建html时使用defaultValue的值.元素,用于设置所选属性. 对于ListBoxFor(),defaultValue的值将是SelectedAssignees属性定义的数组.在DropDownListFor()的情况下,它返回null,因为您的属性的值不能转换为字符串(它的数组). 因为defaultValue为null,所以< option>都不是元素具有选定的属性集,并且您将丢失模型绑定. 作为旁注,如果您在将模型传递给视图之前在GET方法中设置SelectedAssignees的值,您将看到在使用DropDownListFor()时没有选择它们,原因与上述相同. 另请注意,生成SelectList的代码应该是 vm.TasksFilterGroup.Assignees = new SelectList(employees,"FullName" }); 使用DropDownListFor()或ListBoxFor()方法时,没有必要设置第3个参数,因为它绑定到(SelectedAssignees)的属性的值决定了哪些选项被选中(第3个参数被方法忽略).如果要选择与这些Guid值匹配的选项,则在GET方法中使用 vm.TasksFilterGroup.SelectedAssignees= new string[]{ "51b6f06a-e04d-4f98-88ef-cd0cfa8a2757","51b6f06a-e04d-4f98-88ef-cd0cfa8a2769" }; (编辑:东莞站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 模型单元测试能否真正独立,如何[ASP.NET MV
- asp.net – 单个应用程序中的多个母版页
- .net – DNU发布 – 来自MSBuild的no-source
- asp.net – 我可以在超链接上显式指定NavigateUrl吗?
- asp.net – compilation debug =“true”和发布模式“relea
- asp.net – 我应该在.gitingore文件中包含.vs文件夹吗?
- ASP.NET Core 1.0 ConfigurationBuilder().AddJsonFile(“a
- asp.net – Web Forms MVP项目有哪些好的资源?
- 选择顶部N值,但跳过M个结果
- 将ASP.NET身份与核心域模型分离 – 洋葱架构
- asp.net – 在IHTTPHandler中以编程方式创建Syst
- asp.net-mvc – 什么是应用程序洞察遥测(未配置)
- asp.net-mvc – 使用mvc的主要目的
- 从app_data中删除文件夹时如何防止asp.net重新编
- ASP.NET Core 1.0 ConfigurationBuilder().AddJs
- asp.net-web-api – WebAPI 2属性路由启用会话状
- asp.net – IIS Express(WebMatrix)打开外部连接
- 什么是使用aspnet_compiler.exe预编译ASP.NET项目
- asp.net-ajax – Ajax脚本管理器和母版页
- asp.net-mvc – ASP.net MVC DropDownList预选项
