我正在尝试使用 ajax-beginform 调用一个 Action 。
这是我的模型:
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;}
}
我的 View 如下所示:(我正在遍历所有 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" />
}
这是我的 Action :
[System.Web.Mvc.HttpPost]
public async Task DoAction([FromBody] MyViewModel model)
{
// here model is null
}
它总是在 DoAction 中遇到断点但是:
- 如果模型类型是
MyViewModel, 属性(property)SubViewModels为空。 - 如果模型类型是
IEnumerable<SubViewModel>,模型为空。 - 如果模型类型是
SubViewModel,第一个数据集在参数中。
所以我猜,这个 ajax 操作的正确参数来自类型 SubViewModel .
但我需要 MyViewModel或 IEnumerable<SubViewModel>获取所有列出的模型项目。
请您参考如下方法:
您需要为输入命名,以便模型绑定(bind)器可以适本地绑定(bind)发布数据。现在,列表中的每个项目都通过相同的属性名称发布: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>
}
