MVC模型绑定与复选框列表....可能闹鬼

时间:2017-08-30 13:19:40

标签: asp.net-mvc asp.net-mvc-5 model-binding checkboxlist

我有一个带有一个对象列表的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}");
    }

0 个答案:

没有答案