@ Html.Editor模型绑定问题

时间:2013-04-29 15:10:37

标签: asp.net-mvc asp.net-mvc-4

我正在尝试在视图上生成两组复选框列表。这一切都与邮政行动有关。提交时, 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> 
    }
}

MainView.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" />
 }

ParentViewModel

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);
    }

1 个答案:

答案 0 :(得分:1)

尝试更改ParentViewModel的viewmodel,以使用List<CheckboxItem>代替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; }
}

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

修改

另外,作为附注,您不必费心使用EditorTemplate中的for循环,因为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”(see this question,它解释了它会自动迭代列表而不会< / strong>模板名称, 模板名称>:

@Html.BeginForm(){ 
    @Html.EditorFor(m=> m.FirstCheckboxList) 
    @Html.EditorFor(m=> m.SecondCheckboxList) 
}