如何调试 ASP.NET 核心 MVC 数据绑定?

How to debug ASP.NET Core MVC data binding?

我遇到了一个奇怪的问题,我有大量的复选框需要 post 到服务器,但我需要这些带有 id 的复选框的一些隐藏字段才能在服务器端进行正确的映射。

我有这样的东西(手写的所以可能存在拼写错误)

MyVm
{
  public string Id { get; set; }
  public string SecondaryId { get; set; }
  public bool IsSelected { get; set; }  
  public string Name { get; set; }
}

我收集了这些我发送到我的视图

在我看来我有

@foreach(var vm in vms) {
      <div>
         @{ var guid  = Guid.New() }
         @Html.Hidden("Index", guid, new {id = $"Index[{guid}]"})
         @Html.Hidden($"[{guid}.Id", vm.Id)
         @Html.Hidden($"[{guid}].SecondaryId", vm.SecondaryId)
         @(Html.Kendo().CheckBox().Name($"[{guid}].IsSelected")).Label(vm.Name).Checked(vm.IsSelected)
       <div>
}

现在在我的控制器中我有

[HttpPost]
public ActionResult Edit(List<MyVm> vms)
{
   // do some stuff
}

现在,当我执行 post(我的代码包含在表单标签中)时,“vms”为空。

当我注释掉

   @foreach(var vm in vms) {
      <div>
         @{ var guid  = Guid.New() }
         @Html.Hidden("Index", guid, new {id = $"Index[{guid}]"})
       @*  @Html.Hidden($"[{guid}.Id", vm.Id) *@
         @Html.Hidden($"[{guid}].SecondaryId", vm.SecondaryId)
         @(Html.Kendo().CheckBox().Name($"[{guid}].IsSelected")).Label(vm.Name).Checked(vm.IsSelected)
       <div>
}

我的模型绑定成功。

如果我注释掉

   @foreach(var vm in vms) {
      <div>
         @{ var guid  = Guid.New() }
         @Html.Hidden("Index", guid, new {id = $"Index[{guid}]"})
       @Html.Hidden($"[{guid}.Id", vm.Id) 
        @*   @Html.Hidden($"[{guid}].SecondaryId", vm.SecondaryId)*@
         @(Html.Kendo().CheckBox().Name($"[{guid}].IsSelected")).Label(vm.Name).Checked(vm.IsSelected)
       <div>
}

我的模型也绑定成功。

因此,无论出于何种原因,将两者都取消注释会导致我拥有一个空模型,但其中一个或另一个会导致模型绑定。

我该如何调试这样的东西?

您可以在控制器方法中检查 ModelState 属性 以检查模型绑定失败的原因。

    [HttpPost]
    public IActionResult Edit([FromBody] List<MyVm> vms)
    {
        // do some stuff
        var model = this.ModelState;

用 Postman 测试

在控制器中调试