我正在使用VS.2017社区在ASP.NET Core 1.1(MVC)中构建一个Web应用程序。在其中我有一个视图,我必须显示一个复选框列表,然后在提交表单时,模型包含已检查的复选框列表。但是,当POST完成时,其他属性传递得很好,但List<>属性具有正确的长度(每个复选框一个,标记与否)但所有这些属性的IsChecked属性都是 false ,即使选中了复选框也是如此。
传递给视图的我的视图模型如下所示:
ret = Add(1, 2)
我呈现复选框列表的视图的相关部分如下所示:
public class UserPermissionsViewModel {
public string Id { get; set; }
public string UserName { get; set; }
public List<CheckboxListItem> PermissionList { get; set; }
public UserPermissionsViewModel() {
PermissionList = new List<CheckboxListItem>();
}
}
public class CheckboxListItem {
public int ID { get; set; }
public string Display { get; set; }
public bool IsChecked { get; set; }
}
Post控制器动作(简化):
@model Models.UserPermissionsViewModel
@{ // code block in the middle of the view, not at the top!
foreach (CheckboxListItem cbitem in Model.PermissionList) {
<div class="checkbox">
<div class="form-inline col-md-offset-2">
<input type="hidden" asp-for="@Model.PermissionList[i].ID" />
<input type="hidden" asp-for="@Model.PermissionList[i].Display" />
<input type="checkbox" asp-for="@Model.PermissionList[i].IsChecked" value="@Model.PermissionList[i].IsChecked" />
<label asp-for="@Model.PermissionList[i].ID">@Model.PermissionList[i].Display</label>
</div>
</div>
}
}
那么我如何才能真正得到正确的值列表,从而表明例如ID = 1的复选框为真,ID为3的复选框为真?到目前为止,我得到了所有这些,但值 false 而不是实际的复选框状态。
更新#3 经过多次试验,我实际上已经开始工作,并发现为什么复选框的状态没有传递给Post动作方法。
如果您可以在上面看到我的输入标记帮助 复选框类型,不仅有 asp-for 属性,还有值属性。我认为有了它我会让它显示当前值(当渲染视图时)。但事实证明,除了 asp = for 属性之外,如果指定值(或已检查)属性,则POST操作方法无论复选框的实际状态如何,都将始终收到错误。
另一方面,对于复选框类型,您只需指定 asp-for 属性,然后通过模型将复选框状态正确地传达给POST操作方法
因此,替换上面的这个复选框输入实际上解决了问题:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult PermissionAssignToUser(UserPermissionsViewModel model)
{
if (ModelState.IsValid) {
// it gets here but the model.PermissionList pty has ZERO length.
}
}
答案 0 :(得分:0)
经过多次试验,我实际上已经开始工作,并发现为什么复选框的状态没有传递给Post动作方法。
如果您可以在上面看到我的输入标记帮助 复选框类型,不仅有 asp-for 属性,还有值属性。我认为有了它我会让它显示当前值(当渲染视图时)。但事实证明,除了 asp = for 属性之外,如果指定值(或已检查)属性,则POST操作方法无论复选框的实际状态如何,都将始终收到错误。
另一方面,对于复选框类型,您只需指定 asp-for 属性,然后通过模型将复选框状态正确地传达给POST操作方法
因此,替换上面的这个复选框输入实际上解决了问题:
<input type="checkbox" asp-for="@Model.PermissionList[i].IsChecked" />