繁体   English   中英

ASP.NET MVC无法发布绑定到复选框的视图模型

[英]ASP.NET MVC cannot POST view model with binding to checkbox

这是我的视图模型:

public class UserViewModel
{
    public User GroupUser { get; set; }
    public bool Checked { get; set; }
}

public class GroupUserViewModel
{
    public Guid GroupId { get; set; }
    public string GroupName { get; set; }
    public IList<UserViewModel> Users;        
}

我的观点:

@model GroupUserViewModel

@{
    ViewBag.Title = "Users";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>@Model.GroupName</h2>

@using (Html.BeginForm("AddUserToGroup", "Group", FormMethod.Post))
{
    for (var userIter = 0; userIter < Model.Users.Count(); userIter++)
    {
        <div class="form-group">
            @Html.DisplayFor(model => model.Users[userIter].GroupUser.UserName)
            @Html.CheckBoxFor(model => model.Users[userIter].Checked)

            @Html.HiddenFor(model => model.GroupId)
            @Html.HiddenFor(model => model.GroupName)
        </div>        
    }

    <input type="submit" class="btn btn-success" value="Save"/>
}

我的控制器:

[HttpPost]
public ActionResult AddUserToGroup(GroupUserViewModel groupUsers)
{
    //do things    
}

我检查了POST数据,它是:

Users[0].Checked=true
Users[0].Checked=false
Users[1].Checked=false

对于我勾选的框,有2个条目,一个为true ,一个为false 这正常吗?

同样在控制器中,我得到的是:

groupUsers.GroupId = {00000000-0000-0000-0000-000000000000}
groupUsers.GroupName = null
groupUsers.Users = null

显然,由于表单实际上并没有将我想要的视图模型发布回控制器,因此发生了这种情况。 因为我需要GroupIdGroupName有什么方法可以将所需的视图模型传递回控制器?

编辑:

经过一些更新并为GroupIdGroupName添加了隐藏字段之后,现在的POST数据为:

Users[0].Checked=true
Users[0].Checked=false
Id=015f5aef-eb6c-449e-9f08-9d42110c5347
GroupName=MyName
MyObjects[1].Checked=false
Id=015f5aef-eb6c-449e-9f08-9d42110c5347
GroupName=MyName

现在可以正确地传递GroupIdGroupName ,但是列表仍然为null

是的,这很正常。 原因是因为未选中的复选框不会发布值,所以ASP.NET会在复选框控件之后为每个与复选框具有相同ID的复选框呈现一个隐藏字段,并将其值设置为false。 如果存在多个具有相同名称的表单字段,则ASP.NET DefaultModelBinder将采用第一个值。 如果未选中该复选框,则会导致从隐藏字段中发布一个false值,并且两个值,一个为false(隐藏字段),为true(已选中)复选框。 因为隐藏字段位于复选框之后,所以如果复选框发布一个值,它将覆盖隐藏字段。 但是,这并不能回答您关于模型为何不具有约束力的问题。

IList<UserViewModel> Users GroupUserViewModel中的IList<UserViewModel> Users是一个字段,而不是属性,因此DefaultModelBinder无法设置其值。 更改为

public class GroupUserViewModel
{
    ....
    public IList<UserViewModel> Users { get; set; } // make it a property   
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM