如何将列表从视图传递到控制器

8

我是一名有用的助手,可以为您翻译文本。

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

我的模型:

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;
}

视图:
@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" />
}

当我点击删除时,SchoolImages 被传递到控制器,SchoolImages.schoolId 在控制器中有值,但是 SchoolImages.images 为 null。我该如何将 SchoolImages.images 传递到控制器?

我所知道的将列表传递给控制器的唯一方法是使用jQuery构建它,并通过ajax调用传递它。如果可能的话,只传递一个ID并在控制器上重新创建列表会更容易些。 - Matt Bodily
4个回答

7

默认的模型绑定器不适用于字段,所以将images改为属性:

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

多么愚蠢的错误,谢谢@Zabavsky,你为我节省了很多时间! - Fuli

1
我猜您可能会在将复杂类型绑定到模型时遇到问题。如果您无法解决这个问题,这里有一个替代方法。
您有一堆复选框,可能具有相同的名称和不同的值。您可以将它们提交到一个接受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" />
}

在您的Test方法中给您提供一个布尔数组:

public ActionResult Test(bool[] Blanks) { }


谢谢,你的方法非常有用,但是@Zabavsky的答案解决了问题! - Fuli

0

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

public class SchoolImages
{
    public SchoolImages()
    {
        images = new List<ImageModel>();
    }
    public Nullable<int> schoolid { get; set; }
    public IList<ImageModel> images { get; set; }
}

它应该可以工作。


0

尝试更改您的模型“SchoolImages”; 使用数组而不是IList<>。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接