绑定复杂对象(MVC)失败

本文关键字:失败 MVC 复杂 对象 绑定 | 更新日期: 2023-09-27 18:10:03

在选中复选框并提交表单之后,ShouldSend字段是Controller post方法中的默认值(false),即使我选中了适当的复选框使其为真。我查找了类似的问题,两个最常见的建议是检查:

  1. 复杂对象被索引,以便模型绑定器可以将它们放回列表
  2. 我使用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.
}

绑定复杂对象(MVC)失败

啊,我应该张贴SidebarViewModel,而不是WrapperViewModel。现在一切都正确绑定了

public ActionResult SendMessages(SidebarViewModel sidebar)
{
    // do stuff
}