无法让 CheckBox 列表在 ASP.NET Core 中工作
Cannot get CheckBox List to work in ASP.NET Core
我正在使用 VS.2017 Community 在 ASP.NET Core 1.1 (MVC) 中构建 Web 应用程序。在其中我有一个视图,我必须在其中显示一个复选框列表,然后在提交表单时,模型除其他外还包含已选中的复选框列表。然而,当 POST 完成后,其他属性传递良好,但 List<> 属性 具有正确的长度(每个复选框一个,标记与否)但 IsChecked 属性即使选中了复选框,所有这些都是 false。
传递给视图的我的视图模型如下所示:
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; }
}
我呈现复选框列表的视图的相关部分如下所示:
@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>
}
}
以及 Post 控制器动作(简化):
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult PermissionAssignToUser(UserPermissionsViewModel model)
{
if (ModelState.IsValid) {
// it gets here but the model.PermissionList pty has ZERO length.
}
}
那么我如何真正获得正确的值列表,从而表明例如 ID = 1 的复选框为真,ID = 3 的复选框为真?到目前为止,我得到了所有这些,但值 false 而不是实际的复选框状态。
更新#3
经过多次试验,我实际上让它工作并发现了为什么复选框的状态没有传递给 Post 操作方法。
如果你能在上面看到我的输入标签助手 复选框类型不仅有一个asp-for属性也是一个值属性。我认为有了它,我会让它显示当前值(呈现视图时)。但事实证明,如果除了 [ 之外还指定 value(或 checked)属性 =56=]=for 属性 然后 POST 操作方法将始终接收 false,而不管复选框的实际状态如何。
如果另一方面,对于复选框类型,您只指定asp-for 属性 ,然后复选框状态通过模型正确传达给 POST 操作方法。
因此将上面的复选框输入替换为下面的复选框实际上解决了问题:
<input type="checkbox" asp-for="@Model.PermissionList[i].IsChecked" />
经过多次试验,我真正让它工作并发现了为什么复选框的状态没有被传递给 Post 操作方法。
如果你能在上面看到我的输入标签助手 复选框类型不仅有一个asp-for属性也是一个值属性。我认为有了它,我会让它显示当前值(呈现视图时)。但事实证明,如果除了 [ 之外还指定 value(或 checked)属性 =35=]=for 属性 然后 POST 操作方法将始终接收 false,而不管复选框的实际状态如何。
如果另一方面,对于复选框类型,您只指定asp-for 属性 ,然后复选框状态通过模型正确传达给 POST 操作方法。
因此将上面的复选框输入替换为下面的复选框实际上解决了问题:
<input type="checkbox" asp-for="@Model.PermissionList[i].IsChecked" />
我正在使用 VS.2017 Community 在 ASP.NET Core 1.1 (MVC) 中构建 Web 应用程序。在其中我有一个视图,我必须在其中显示一个复选框列表,然后在提交表单时,模型除其他外还包含已选中的复选框列表。然而,当 POST 完成后,其他属性传递良好,但 List<> 属性 具有正确的长度(每个复选框一个,标记与否)但 IsChecked 属性即使选中了复选框,所有这些都是 false。
传递给视图的我的视图模型如下所示:
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; }
}
我呈现复选框列表的视图的相关部分如下所示:
@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>
}
}
以及 Post 控制器动作(简化):
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult PermissionAssignToUser(UserPermissionsViewModel model)
{
if (ModelState.IsValid) {
// it gets here but the model.PermissionList pty has ZERO length.
}
}
那么我如何真正获得正确的值列表,从而表明例如 ID = 1 的复选框为真,ID = 3 的复选框为真?到目前为止,我得到了所有这些,但值 false 而不是实际的复选框状态。
更新#3 经过多次试验,我实际上让它工作并发现了为什么复选框的状态没有传递给 Post 操作方法。
如果你能在上面看到我的输入标签助手 复选框类型不仅有一个asp-for属性也是一个值属性。我认为有了它,我会让它显示当前值(呈现视图时)。但事实证明,如果除了 [ 之外还指定 value(或 checked)属性 =56=]=for 属性 然后 POST 操作方法将始终接收 false,而不管复选框的实际状态如何。
如果另一方面,对于复选框类型,您只指定asp-for 属性 ,然后复选框状态通过模型正确传达给 POST 操作方法。
因此将上面的复选框输入替换为下面的复选框实际上解决了问题:
<input type="checkbox" asp-for="@Model.PermissionList[i].IsChecked" />
经过多次试验,我真正让它工作并发现了为什么复选框的状态没有被传递给 Post 操作方法。
如果你能在上面看到我的输入标签助手 复选框类型不仅有一个asp-for属性也是一个值属性。我认为有了它,我会让它显示当前值(呈现视图时)。但事实证明,如果除了 [ 之外还指定 value(或 checked)属性 =35=]=for 属性 然后 POST 操作方法将始终接收 false,而不管复选框的实际状态如何。
如果另一方面,对于复选框类型,您只指定asp-for 属性 ,然后复选框状态通过模型正确传达给 POST 操作方法。
因此将上面的复选框输入替换为下面的复选框实际上解决了问题:
<input type="checkbox" asp-for="@Model.PermissionList[i].IsChecked" />