我试图用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
。但是我需要
MyViewModel
或IEnumerable<SubViewModel>
来获取所有列出的模型项目。 最佳答案
您需要命名输入,以便Modelbinder可以适当地绑定发布数据。现在,列表中的每个项目都通过相同的属性名称发布:Name
,Age
和Active
。您真正需要的是像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/