我正在尝试用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
。
但我需要MyViewModel
或IEnumerable<SubViewModel>
来获取所有列出的模型项目。
答案 0 :(得分:3)
您需要为输入命名,以便模型绑定器可以适当地绑定发布数据。如您所知,列表中的每个项目都通过相同的属性名称发布: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>
}