无法让 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" />