我有一个带有一个对象列表的viewmodel,我将这些对象呈现为MVC
CheckboxFor()
帮助器的复选框,如下所示:
@Html.CheckBoxFor(x => x.OrganisationDetails.Industries[i].Checked)
当HTML呈现时,我得到标准的双输出,它应该显示为:
<input id="OrganisationDetails_Industries_0__Checked" name="OrganisationDetails.Industries[0].Checked" type="checkbox" value="true">
<input name="OrganisationDetails.Industries[0].Checked" type="hidden" value="false">
当我查看发布的HTTP标头时,我看到为我勾选的复选框设置了正确的值:
OrganisationDetails.Industries[3].Checked:true
OrganisationDetails.Industries[3].Checked:false
但是,当我回到C#并检查收到表单的POST操作的model
参数时,该值始终绑定为false。
我知道很多其他问题围绕这个问题,但大多数人说,当HTTP表单值如上所述发布时,模型绑定器应处理它,但在我的情况下不是。
我确保表格上没有其他字段,没有hiddens踢,没有自定义模型绑定配置等等。
表单其他区域的其他所有内容都可以绑定,而不是复选框。
是因为它们嵌套在子类中吗?在帖子期间,属性Checked
是否与HTML属性冲突?我在这里严重难倒,即将恢复使用帮手。
我在这里发帖是因为我不相信助手从根本上被打破了,所以我想明白我做错了什么!
编辑:如果有任何帮助,这是模型(为了简洁而删节)和控制器操作。
**model classes**
public class Industry
{
public int Id { get; set; }
public string Name { get; set; }
public bool Checked { get; set; }
}
public class OrganisationDetails
{
[Required]
[Display(Name = "Industry", Description = "Select all that apply")]
public List<Industry> Industries = new List<Industry>
{
new Industry { Id = 1, Name = "Industry 1" },
new Industry { Id = 2, Name = "Industry 2" },
new Industry { Id = 3, Name = "Industry 3" },
new Industry { Id = 4, Name = "Industry 4" }
};
}
public class TheViewModel
{
public OrganisationDetails { get; set; }
}
**controller action**
[HttpPost]
[Route("OrganisationDetails/Part/{id}")]
public ActionResult OrganisationDetails(int id, TheViewModel model)
{
// breakpoint is on this line, model.OrganisationDetails.Industries are all shown with 'Checked = false'
// this is where I was about to write the persistance code, but the model values aren't correct for this collection, so there is nothing in here.
return RedirectToAction($"OrganisationDetails/Part/{id + 1}");
}