我在控制器中有这个:
public ActionResult Index()
{
var viewModels = _dataSyncService.Get().Select(provider => new IndexViewModel
{
Selected = false, Provider = provider
}).ToList();
return View(viewModels);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(IEnumerable<IndexViewModel> viewModels)
{
//Breakpoint on this to check viewModels
}
视图模型:
public class IndexViewModel
{
public bool Selected { get; set; }
public IDataSyncProvider Provider { get; set; }
}
我的Index.cshtml:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<button type="submit" class="btn blue">Trigger Selected</button>
@foreach (var sync in Model)
{
<tr>
<td>
@Html.CheckBoxFor(s => sync.Selected)
</td>
<td>@sync.Provider.FriendlyName</td>
</tr>
}
}
但是我的模型被贴回来了,viewModels
总是回来为null。我读了很多关于必须将Id分配给复选框等但我认为这是Html.CheckBoxFor
的用途。
我确信我会在某些时候对此表示不满,但我可以提供一些指导。
答案 0 :(得分:2)
如果要使用内置的Html帮助程序,如Html.CheckBoxFor
,则需要使用for
循环而不是foreach
,以便帮助程序呈现正确的输入名称:
@for(int sync = 0; sync < Model.Count; sync++)
{
<tr>
<td>
@Html.CheckBoxFor(m => Model[sync].Selected)
</td>
<td>@Model[sync].Provider.FriendlyName</td>
</tr>
}
您可以在此处阅读有关绑定到列表的更多信息:Model Binding To A List
答案 1 :(得分:-1)
这是因为,您只是使用return RedirectToAction(“Index”)重定向它;
在你的POST动作中
尝试:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(IEnumerable<IndexViewModel> viewModels)
{
return View(viewModels);
}
希望会有所帮助。