如何调试 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 测试
在控制器中调试
我遇到了一个奇怪的问题,我有大量的复选框需要 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 测试
在控制器中调试