列表的Ajax BeginForm仅返回模型的第一个元素或null

时间:2017-03-08 14:34:03

标签: c# jquery ajax asp.net-mvc

我正在尝试用ajax-beginform调用一个动作。

这是我的模特:

public class MyViewModel
{
    public List<SubViewModel> SubViewModels {get;set;}
}

public class SubViewModel
{
    public string Name {get;set;}
    public int Age {get;set;}
    public bool Active {get;set;}
}

我的观点如下所示:(我正在迭代所有SubViewModel-Items,并希望稍后在我的DoAction-Method中获取这些内容)

@model MyViewModel

@using (Ajax.BeginForm("DoAction", "MyController", null, new AjaxOptions() { HttpMethod = "Post" }, new { @class = "search-form", enctype = "multipart/form-data" }))
{
<table class="table">
        <thead>
            <tr>
                <th>Name</th>
                <th>Age</th>
                <th>Active</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.SubViewModels)
            {
                <tr>
                    <td><input type="text" name="Name" value="@item.Name" /></td>
                    <td><input type="text" name="Age" value="@item.Age" /></td>
                    <td><input type="checkbox" name="Active" value="@item.Active" /></td>
                </tr>
            }
        </tbody>
        </table>
    <input type="submit" value="OK" />
}

这是我的行动:

[System.Web.Mvc.HttpPost]
public async Task DoAction([FromBody] MyViewModel model)
{
    // here model is null
}

它总是在DoAction中遇到断点,但是:

  • 如果模型类型为MyViewModel,则属性SubViewModels为空。
  • 如果模型类型为IEnumerable<SubViewModel>,则模型为空。
  • 如果模型类型为SubViewModel,则第一个数据集位于参数中。

所以我想,这个ajax-action的正确参数来自类型SubViewModel

但我需要MyViewModelIEnumerable<SubViewModel>来获取所有列出的模型项目。

1 个答案:

答案 0 :(得分:3)

您需要为输入命名,以便模型绑定器可以适当地绑定发布数据。如您所知,列表中的每个项目都通过相同的属性名称发布:NameAgeActive。您实际需要的是SubViewModels[N].Name之类的名称,其中N是整数索引值。最简单的方法是实际使用HTML帮助程序生成输入,并且您还需要使用for循环,而不是foreach

@for (var i = 0; i < Model.SubViewModels.Count(); i++)
{
    <tr>
        <td>@Html.TextBoxFor(m => m.SubViewModels[i].Name)</td>
        <td>@Html.TextBoxFor(m => m.SubViewModels[i].Age)</td>
        <td>@Html.CheckBoxFor(m => m.SubViewModels[i].Name)</td>
    </tr>
}