2

在我的 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>

更新 1: 在安德烈回答后呈现 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>
4

3 回答 3

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

is not going to generate right name for the input. Your form sends the same token item.IsActive=true (or false) for all items. While this approach works for primitives, it does not work for complex types.

However here is what you can do using for instead of 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" />
}

Notice that this requires at least IList<> as a view type - otherwise you cannot iterate through the collection using for.

于 2013-06-21T12:03:21.733 回答
0

你可以发布渲染的html吗?

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

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

更新:您可以在这里查看演练:

我认为您可以先尝试name将输入更改为data. 你可以尝试这样做:

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

更改后,表单应向控制器提交以逗号分隔的值列表。您也可以打开 firebug 并在此处发布发布到控制器的内容吗?

于 2013-06-21T11:54:43.503 回答
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" />
}
于 2013-06-21T11:48:37.513 回答