0

我正在尝试在视图上生成两组复选框列表。除了发布操作之外,这一切都有效。提交时,ParentViewModel 未正确绑定 ChildViewModel 模型。FirstCheckboxList 模型。SecondCheckboxList 以上两者都为空。

我不确定我错过了什么。对此的任何帮助都会很棒。提前致谢。

CheckboxItems.cshtml

@model List<CheckboxItem>
@{        
    for (int i = 0; i < Model.Count(); i++)
    {
       <div>
       @Html.CheckBoxFor(x => x.ElementAt(i).Checked, new { @id = Model.ElementAt(i).Id, onclick = "GetValue()" })
          <span id="Padded">@Model.ElementAt(i).Text</span>
       </div> 
    }
}

主视图.cshtml

 @Html.BeginForm(){     
       @Html.EditorFor(m=> m.FirstCheckboxList,"CheckboxItems") 
       @Html.EditorFor(m=> m.SecondCheckboxList, "CheckboxItems")                
 }
 @Html.TextBoxFor(m => m.FSelected, new Dictionary<string,object>() {{"readonly",true}})       
 @Html.TextBoxFor(m => m.FUniverse,new Dictionary<string,object>() {{"readonly",true}})
        <input type="submit" name="nextBtn" value ="Next" />
 }

父视图模型

public class ParentViewModel
{       
    public int PId { get; set; }
    public IEnumerable<CheckboxItem> FirstCheckboxList{ get; set; }
    public IEnumerable<CheckboxItem> SecondCheckboxList{ get; set; }
    public Int64 FSelected { get; set; }
    public Int64 FUniverse { get; set; }
}

CheckboxItem : 子视图模型

 public class CheckboxItem
  {
    public int Id { get; set; }
    public string Text { get; set; }
    public bool Checked { get; set; }
  }

控制器动作

   [HttpPost]
    public ActionResult MyCheckboxView(int planid,   ParentViewModel model, string nextBtn)
    {
        // do something
        return View(Model);
    }
4

1 回答 1

1

尝试更改视图模型ParentViewModel以使用 aList<CheckboxItem>而不是 a IEnumerable<CheckboxItem>

public class ParentViewModel
{       
    public int PlanId { get; set; }
    public List<CheckboxItem> FirstCheckboxList{ get; set; }
    public List<CheckboxItem> SecondCheckboxList{ get; set; }
    public Int64 FSelected { get; set; }
    public Int64 FUniverse { get; set; }
}

模型绑定器需要一个类似 aList或 an的数据结构,Array以便它可以正确绑定指定索引处的元素。IEnumerable只是一个接口,不支持这样的索引。

编辑

此外,作为旁注,您不必为forEditorTemplate 中的循环而烦恼,因为 MVC 可以为您完成所有这些工作。只需将模型类型更改为@model CheckboxItem,删除循环并摆脱id属性,使其看起来像这样:

@model CheckboxItem
@{        

   <div>
   @Html.CheckBoxFor(x => x.Checked, new { onclick = "GetSelectedFrame()" })
      <span id="Padded">@Model.Text</span>
   </div> 
    }
}

另外,请确保您的EditorFor调用不提供 EditorTemplate 的名称,因为这会弄乱“MVC Magic”(请参阅​​此问题,它解释了它会自动迭代没有模板名称且不使用模板名称的列表):

@Html.BeginForm(){ 
    @Html.EditorFor(m=> m.FirstCheckboxList) 
    @Html.EditorFor(m=> m.SecondCheckboxList) 
} 
于 2013-04-29T15:36:09.067 回答