IEnumerable数据没有从视图传回控制器

时间:2013-06-21 11:45:22

标签: c# asp.net-mvc-4

在我的MVC4项目视图中,我将IEnumerable<Settings>模型传递给视图。当我将表单提交回控制器时,控制器方法的参数为IEnumerable<Settings> data。问题是data始终为空。

查看

@model IEnumerable<Settings>

@using (Html.BeginForm("Index", "Layout", FormMethod.Post)))
{
    @foreach (var item in Model)
    {
       @Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })
       @Html.DisplayFor(modelItem => item.Name)
    }
    <input type="submit" value="Save" />
}

控制器

[HttpPost]
public ActionResult Index(IEnumerable<Settings> data)
{
    --actual code goes here
}

模型

[Serializable]
public class Settings
{   
    public virtual byte Id { get; set; }

    public virtual string Name { get; set; }

    public virtual bool IsActive { get; set; }

    public virtual DataTable DataResult { get; set; }

    public virtual int CreatedBy { get; set; }

    public virtual DateTime CreatedDate { get; set; }

    public virtual int ClientId { get; set; }

    public virtual Int16 NoofItems { get; set; }
}

更新 * 呈现HTML *

<td>
    <input checked="checked" data-val="true" data-val-required="The IsActive field is required." id="item_IsActive" name="item.IsActive" type="checkbox" value="13" class="valid"><input name="item.IsActive" type="hidden" value="false">
                                # of pieces

                                </td>

UPDATE1: 按照Andrei的回答

后呈现HTML
<td>
     <input checked="checked" data-val="true" data-val-required="The IsActive field is required." name="[0].IsActive" type="checkbox" value="13"><input name="[0].IsActive" type="hidden" value="false">
                                    # of pieces</td>

3 个答案:

答案 0 :(得分:5)

@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })

不会为输入生成正确的名称。您的表单会为所有项目发送相同的令牌item.IsActive=true(或false)。虽然这种方法适用于基元,但它不适用于复杂类型。

但是,您可以使用for代替foreach来执行此操作:

@model IList<Settings>

@using (Html.BeginForm())
{
    @for(int i=0; i<Model.Count; i++)
    {
       @Html.CheckBoxFor(m => m[i].IsActive, new { @value = Model[i].Id })
       @Html.DisplayFor(m => m[i].Name)
    }
    <input type="submit" value="Save" />
}

请注意,这至少需要IList<>作为视图类型 - 否则您无法使用for遍历集合。

答案 1 :(得分:0)

可能需要以表格形式包装您的输入:

@using (Html.BeginForm()) {
   @foreach (var item in Model)
   {
      @Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })
      @Html.DisplayFor(modelItem => item.Name)
   }
   <input type="submit" value="Save" />
}

答案 2 :(得分:0)

你可以发布renderred html吗?

我认为这是问题所在: 输入的名称(复选框)将在html中为IsActive。当您点击提交时,表单将使用密钥IsActive提交数据。在您的控制器中,您当前需要一个名为data的参数,因此存在不匹配。

您可以通过在控制器中添加断点并检查Request [“IsActive”]是否具有值来解决此问题。

更新: 您可以查看here进行演练:

我认为您可以先尝试将输入的name更改为data。您可以尝试使用:

@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id, name="data" })

更改后,表单应以逗号分隔的值列表提交给控制器。你能打开萤火虫并在这里张贴发布到控制器的内容吗?