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 Web Api HttpResponseException 400(错误请求)被II
- asp.net-mvc – EF 4.1 Code First:“非空值类型’DateTim
- 序列化 – Newtonsoft中的TypeNameHandling需要$type作为第
- IIS7集成vs经典流水线 – 哪些使用更多的ASP.NET线程?
- asp.net-core – 带有JSONP的ASP.NET Core MVC
- asp.net – 解析接受标题
- asp.net – 如何在DLL中添加Web服务引用
- asp.net 读取并修改config文件实现代码
- asp.net – 在web.config或数据库中存储配置设置
- asp.net-mvc – ASP.NET MVC – 主页面和视图页面的不同模型
- asp.net-mvc – System.Web.Mvc.ActionFilterAtt
- asp.net-mvc – 如何为所有控制器编写动作过滤器
- 使用ASP.NET MVC的jQuery表单验证
- asp.net-mvc – 为什么.NET在MVC asp.net应用程序
- asp.net-mvc – 官方的“如何”MVC编辑器/显示模
- asp.net-mvc – 为什么需要为Html.Action定义的路
- 在ASP.NET中清除FileUpload内容
- https://github.com/hoyuhub
- asp.net-mvc-3 – ASP.NET AJAX.BeginForm发送多
- asp.net-mvc – 如何在asp.net mvc中处理分页?
