Asp.net mvc 如何将列表从视图传递到控制器

Asp.net mvc 如何将列表从视图传递到控制器,asp.net-mvc,list,asp.net-mvc-4,Asp.net Mvc,List,Asp.net Mvc 4,我在将对象中的列表从视图传递到控制器时遇到问题,该列表始终为空。我该怎么做 我的模型: public class ImageModel { public int id { get; set; } public string url { get; set; } public bool delete { get; set; } } public class SchoolImages { public Nullable<int> schoolid { ge

我在将对象中的列表从视图传递到控制器时遇到问题,该列表始终为空。我该怎么做

我的模型:

public class ImageModel
{
    public int id { get; set; }
    public string url { get; set; }
    public bool delete { get; set; }
}

public class SchoolImages
{
    public Nullable<int> schoolid { get; set; }
    public IList<ImageModel> images;
}
公共类ImageModel
{
公共int id{get;set;}
公共字符串url{get;set;}
公共布尔删除{get;set;}
}
公立学校形象
{
公共可为空的学校ID{get;set;}
公众形象;
}
观点:

@model SchoolAppManager.Models.SchoolImages

@using (Html.BeginForm("DeleteImages", "Images"))
{

    @Html.HiddenFor(x => x.schoolid)
    <table>
    @for (int i = 0; i < Model.images.Count(); i += 4) {

        <tr>
            <td>
                <img src="@Url.Content(Model.images[i].url)" width="50%" />
                <br />
                @Html.CheckBoxFor(x => x.images[i].delete)
                @Html.HiddenFor(x => x.images[i].id)
            </td>
            <td>
                @if (i + 1 < Model.images.Count())
                {
                    <img src="@Url.Content(Model.images[i + 1].url)" width="50%" />
                    <br />
                    @Html.CheckBoxFor(x => x.images[i + 1].delete)
                    @Html.HiddenFor(x => x.images[i + 1].id)
                }
            </td>
            <td>
                @if (i + 2 < Model.images.Count())
                {
                    <img src="@Url.Content(Model.images[i + 2].url)" width="50%" />
                    <br />
                    @Html.CheckBoxFor(x => x.images[i + 2].delete)
                    @Html.HiddenFor(x => x.images[i + 2].id)
                }
            </td>
            <td>
                @if (i + 3 < Model.images.Count())
                {
                    <img src="@Url.Content(Model.images[i + 3].url)" width="50%" />
                    <br />
                    @Html.CheckBoxFor(x => x.images[i + 3].delete)
                    @Html.HiddenFor(x => x.images[i + 3].id)
                }
            </td>
        </tr>
    }
    </table>

    <input type="submit" value="delete" />
}
@model SchoolAppManager.Models.SchoolImages
@使用(Html.BeginForm(“删除图像”、“图像”))
{
@Html.HiddenFor(x=>x.schoolid)
@对于(int i=0;i
@Html.CheckBoxFor(x=>x.images[i].删除)
@Html.HiddenFor(x=>x.images[i].id)
@if(i+1
@Html.CheckBoxFor(x=>x.images[i+1]。删除)
@Html.HiddenFor(x=>x.images[i+1].id)
}
@if(i+2
@Html.CheckBoxFor(x=>x.images[i+2]。删除)
@Html.HiddenFor(x=>x.images[i+2].id)
}
@if(i+3
@Html.CheckBoxFor(x=>x.images[i+3]。删除)
@Html.HiddenFor(x=>x.images[i+3].id)
}
}
}

当我单击“删除”时,
schoolmages
被传递给控制器,
schoolmages.schoolId
在控制器中有值,但是,
schoolmages.images
为空。如何将
school images.images
传递给控制器?

默认型号活页夹不适用于字段,因此将
images
设置为属性:

public IList<ImageModel> images { get; set; }
public IList映像{get;set;}

我想您在将复杂类型绑定到模型时会遇到问题。以防你不能让它工作。这是另一种方法

您有一组复选框,可能具有相同的名称和不同的值。您可以将它们发布到采用FormCollection的方法,即

public ActionResult Test(FormCollection collection)
{
    string results = collection["Blanks"];
}
这将为您提供一个以逗号分隔的值列表(或null,其中不勾选复选框)

或者,如果服务器上的数组中有可能的值,则可以根据其数组值为复选框命名,这意味着您可以执行以下操作:

@using (Html.BeginForm("Test","Home"))
{
    @Html.CheckBox("Blanks[0]", false);
    @Html.CheckBox("Blanks[1]", false);
    @Html.CheckBox("Blanks[2]", false);

    <input type="submit" value="Submit" />
}
public class SchoolImages
{
    public SchoolImages()
    {
        images = new List<ImageModel>();
    }
    public Nullable<int> schoolid { get; set; }
    public IList<ImageModel> images { get; set; }
}
@使用(Html.BeginForm(“Test”、“Home”))
{
@复选框(“空白[0]”,false);
@复选框(“空白[1]”,false);
@复选框(“空白[2]”,false);
}
在测试方法中为您提供一系列布尔值:

公共行动结果测试(bool[]空白)
{}

试着改变你的“学校形象”模型;使用数组而不是IList

它是空的,因为默认的模型绑定器不知道如何初始化它。 将字段图像更改为属性并添加如下构造函数:

@using (Html.BeginForm("Test","Home"))
{
    @Html.CheckBox("Blanks[0]", false);
    @Html.CheckBox("Blanks[1]", false);
    @Html.CheckBox("Blanks[2]", false);

    <input type="submit" value="Submit" />
}
public class SchoolImages
{
    public SchoolImages()
    {
        images = new List<ImageModel>();
    }
    public Nullable<int> schoolid { get; set; }
    public IList<ImageModel> images { get; set; }
}
公共班级学校形象
{
公共学校形象()
{
图像=新列表();
}
公共可为空的学校ID{get;set;}
公共IList映像{get;set;}
}

它应该可以工作。

我所知道的将列表传递给控制器的唯一方法是使用jquery构建它,并通过ajax调用传递它。如果可能的话,传递id并在控制器上重新创建列表会容易得多。这是一个愚蠢的错误,谢谢@Zabavsky,你为我节省了很多时间!谢谢,你的方法很有用,不过,@Zabavsky的回答起了作用!