【问题标题】:How to pass list from view to controller如何将列表从视图传递到控制器
【发布时间】:2014-02-08 14:00:14
【问题描述】:

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

我的模特:

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 为空。如何将SchoolImages.images 传递给控制器​​?

【问题讨论】:

  • 我所知道的将列表传递给控制器​​的唯一方法是使用 jquery 构建它并通过 ajax 调用传递它。如果可能的话,传递一个 id 并在控制器上重新创建列表会容易得多

标签: asp.net-mvc list asp.net-mvc-4


【解决方案1】:

默认模型绑定器不适用于字段,因此将images 设为属性:

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

【讨论】:

  • 多么愚蠢的错误,谢谢@Zabavsky,你为我节省了很多时间!
【解决方案2】:

我猜您在将复杂类型绑定到模型时会遇到问题。万一你没有得到那个工作。这是另一种方法。

您有一堆复选框,可能具有相同的名称和不同的值。您可以将它们发布到采用 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" />
}

在您的测试方法中为您提供一个布尔数组:

公共 ActionResult 测试(bool[] 空白) { }

【讨论】:

  • 谢谢,您的方法非常有用,但是,@Zabavsky 的回答成功了!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多