绑定复杂对象(MVC)失败
本文关键字:失败 MVC 复杂 对象 绑定 | 更新日期: 2023-09-27 18:10:03
在选中复选框并提交表单之后,ShouldSend字段是Controller post方法中的默认值(false),即使我选中了适当的复选框使其为真。我查找了类似的问题,两个最常见的建议是检查:
- 复杂对象被索引,以便模型绑定器可以将它们放回列表
- 我使用CheckBoxFor,以便将复选框的结果绑定到我的模型
我目前正在做这两件事,但它仍然没有绑定。其他的一切都绑定得很好(例如,SidebarViewModel中的MessageTypeViewModels列表)。
知道为什么我的复选框没有绑定吗?
视图模型
public class WrapperViewModel
{
public WrapperViewModel()
{
Sidebar = new SidebarViewModel();
Content = new ContentViewModel();
}
public SidebarViewModel Sidebar { get; set; }
public ContentViewModel Content { get; set; }
}
public class SidebarViewModel
{
public SidebarViewModel()
{
MessageTypeViewModels = new List<MessageTypeViewModel>
{
new TypeViewModel {Type = "Type 1", Label = "Label 1"},
new TypeViewModel {Type = "Type 2", Label = "Label 2"},
// etc.
};
}
public IEnumerable<MessageTypeViewModel> MessageTypeViewModels { get; set; }
public int Field2 { get; set; }
public int? Field3 { get; set; }
}
public class MessageTypeViewModel
{
public string Type { get; set; }
public string Label { get; set; }
public bool ShouldSend { get; set; }
}
// Index.cshtml
@model MessageGeneratorViewModel
@using (Ajax.BeginForm("SendMessages", new AjaxOptions
{
HttpMethod = "POST",
UpdateTargetId = "content",
}))
{
<div id="sidebar">
<h3>Message Types</h3>
<ul>
@Html.EditorFor(m => m.MessageTypeViewModels, "MessageTypeEditorTemplate")
</ul>
<h3>Target</h3>
<ul>
<li>
@Html.LabelFor(m => m.Field2)
@Html.TextBoxFor(m => m.Field2)
</li>
<li>
@Html.LabelFor(m => m.Field3)
@Html.TextBoxFor(m => m.Field3)
</li>
</ul>
<button type="submit">Send Message</button>
</div>
}
// MessageTypeEditorTemplate.cshtml
@model List<MessageTypeViewModel>
@for (int i = 0; i < Model.Count; i++)
{
<li>
<label>
@Html.CheckBoxFor(m => m[i].ShouldSend)
@Model[i].Label
</label>
</li>
}
控制器public ActionResult SendMessages(WrapperViewModel model)
{
// model.Sidebar.MessageTypeViewModels[<any-index>].ShouldSend is false, even if I checked the appropriate box.
}
啊,我应该张贴SidebarViewModel,而不是WrapperViewModel。现在一切都正确绑定了
public ActionResult SendMessages(SidebarViewModel sidebar)
{
// do stuff
}