2015-08-26 106 views
-1

在检查框并提交表单后,即使在我检查了相应的框以使其为true,ShouldSend字段仍是Controller post方法中的默认值(false)。我抬头一看类似的问题,这两个最常见的建议是检查:CheckBoxFor未能绑定到复杂对象(MVC)

  1. 复杂的对象索引,以便模型绑定可以在列表
  2. 我为了使用CheckBoxFor把他们重新走到一起将复选框的结果绑定到我的模型

我目前正在做这两件事,但它仍然没有约束力。其他所有内容都可以正常绑定(例如,SidebarViewModel中的MessageTypeViewModel列表)。

任何想法为什么我的复选框没有约束力?

的ViewModels

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. 
} 

回答

0

啊,我本来应该p osbar SidebarViewModel,而不是WrapperViewModel。现在一切正确。

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