asp.net-mvc-3 – MVC3 – 具有复杂类型列表的Viewmodel
如果以前曾经问过,就道歉有一百万种方式来说明它,所以寻找答案已被证明是困难的。
我有一个具有以下属性的viewmodel: public class AssignSoftwareLicenseViewModel { public int LicenseId { get; set; } public ICollection<SelectableDeviceViewModel> Devices { get; set; } } SelectableDeviceViewModel的简化版本将是: public class SelectableDeviceViewModel { public int DeviceInstanceId { get; set; } public bool IsSelected { get; set; } public string Name { get; set; } } 在我的视图中,我尝试在输入表单中显示“设备”属性的可编辑复选框列表。 @using (Html.BeginForm()) { @Html.HiddenFor(x => Model.LicenseId) <table> <tr> <th>Name</th> <th></th> </tr> @foreach (SelectableDeviceViewModel device in Model.Devices) { @Html.HiddenFor(x => device.DeviceInstanceId) <tr> <td>@Html.CheckBoxFor(x => device.IsSelected)</td> <td>@device.Name</td> </tr> } </table> <input type="submit" value="Assign" /> } 问题是,当模型被发回控制器时,设备为空。 我的假设是,这是发生的,因为即使我正在编辑它的内容,Devices属性从未被明确地包含在窗体中。我尝试用HiddenFor包含它,但是这只是导致模型有一个空列表,而不是null。 任何想法我在这里做错什么? 解决方法
不,你的假设是错误的。这不能正确绑定的原因是因为您的输入字段没有正确的名称。例如,它们被称为name =“IsSelected”,而不是name =“Devices [0] .IsSelected”。看看需要用于绑定到集合的正确的线格式:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
这是因为您在视图中使用的foreach循环。你使用x => device.IsSelects作为复选框的lambda表达式,但这并没有考虑到Devices属性(通过查看生成的网页的源代码可以看出)。
我个人建议您使用编辑器模板,因为它们尊重复杂属性的导航上下文并生成正确的输入名称。所以在你的视图中摆脱整个foreach循环,并用一行代码替换它: @Html.EditorFor(x => x.Devices) 并且现在定义一个自定义编辑器模板,该模板将由ASP.NET MVC为Devices集合的每个元素自动呈现。警告:此模板的位置和名称非常重要,因为这可以按照惯例工作:?/ Views / Shared / EditorTemplates / SelectableDeviceViewModel.cshtml: @model SelectableDeviceViewModel @Html.HiddenFor(x => x.DeviceInstanceId) <tr> <td>@Html.CheckBoxFor(x => x.IsSelected)</td> <td>@Html.DisplayFor(x => x.Name)</td> </tr> 另一种方法(我不推荐)将视图模型中的当前ICollection更改为索引集合(如IList T或数组T []): public class AssignSoftwareLicenseViewModel { public int LicenseId { get; set; } public IList<SelectableDeviceViewModel> Devices { get; set; } } 然后代替foreach使用for循环: @for (var i = 0; i < Model.Devices.Count; i++) { @Html.HiddenFor(x => x.Devices[i].DeviceInstanceId) <tr> <td>@Html.CheckBoxFor(x => x.Devices[i].IsSelected)</td> <td>@Html.DisplayFor(x => x.Devices[i].Name</td> </tr> } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Asp.Net MVC 4:我们可以设置Layout = null
- asp.net-mvc – 如何使用Visual Studio 2013和Entity Frame
- asp-classic – 使用TFS 2010“构建”经典ASP
- asp.net – 如何在iframe中提交后刷新iframe父页面?
- asp.net-mvc – 当我尝试在我的asp.net mvc中导入我的存储过
- 如何从asp.net HyperLink控件调用javascript
- asp.net-mvc – 从MVC 3升级到4后,Razor帮助器方法无效
- c#自定义日志记录
- asp.net – GridView中的DropDownList SelectedIndexChange
- 通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
- asp.net – 在实体框架中使用PersianCalendar作为
- asp.net – 从Mvc Action中获取WebApi UrlHelper
- asp.net-mvc – ASP.NET MVC是否允许私有ViewMod
- asp.net – 错误:数据绑定方法(如Eval(),XPath(
- asp.net – web.config文件中的自定义错误页面未
- asp.net – 没有配置验证处理程序来处理方案:自
- asp.net – 多项目模板文件夹结构不正确
- asp.net:将updatepanel中的控件排除在执行异步回
- 基于ASP.Net Core开发的一套通用后台框架
- 为什么使用ASP.NET OutputCache继续返回200 OK,而