我遇到了一个奇怪的问题,我有大量的复选框需要发布到服务器,但我需要这些带有 id 的复选框的一些隐藏字段才能在服务器端进行正确的映射。
我有这样的东西(自由双手,所以可能存在拼写错误)
MyVm
{
public string Id { get; set; }
public string SecondaryId { get; set; }
public bool IsSelected { get; set; }
public string Name { get; set; }
}
我收集了这些内容并发送到我的 View
在我看来,我有
@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>
}
现在在我的 Controller 中我有
[HttpPost]
public ActionResult Edit(List<MyVm> vms)
{
// do some stuff
}
现在,当我发表帖子时(我的代码包含在表单标签中)“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>
}
我的模型绑定(bind)成功。
如果我注释掉
@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>
}
我的模型也绑定(bind)成功。
因此,无论出于何种原因,将两者都取消注释会导致我的模型为空,但其中一个会导致模型绑定(bind)。
如何调试这样的东西?
最佳答案
您可以检查 Controller 方法中的ModelState
属性来检查模型绑定(bind)失败的原因。
[HttpPost]
public IActionResult Edit([FromBody] List<MyVm> vms)
{
// do some stuff
var model = this.ModelState;
使用 Postman 进行测试
在 Controller 中调试
关于c# - 如何调试 ASP.NET Core MVC 数据绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66016564/