我试图用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为null。
如果模型的类型为IEnumerable<SubViewModel>,则模型为null。
如果模型类型为SubViewModel,则第一个数据集位于参数中。


因此,我猜想,此ajax-action的正确参数来自类型SubViewModel

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

最佳答案

您需要命名输入,以便Modelbinder可以适当地绑定发布数据。现在,列表中的每个项目都通过相同的属性名称发布: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>
}

关于c# - 列表的Ajax BeginForm仅返回model的第一个元素或null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42674130/

10-09 19:48