asp.Net   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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-3 – MVC3 – 具有复杂类型列表的Viewmodel全部内容,希望文章能够帮你解决asp.net-mvc-3 – MVC3 – 具有复杂类型列表的Viewmodel所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。