Asp.net core将复选框数据从视图张贴到控制器上

问题描述 投票:0回答:1

我是Asp.net core的新手,我想知道我做错了什么,我有这样的模型,正在填充我的View。

Public class Person
{
        public string Id { get; set; }

        public string Name { get; set; }

        public bool IsSelected { get; set; }
    }

Public class Collection
{
     public List<Person> People { get; set; }
}

一个View需要一个复选框项的形式 并且要将 "isSelected "设置为true。

@model Collection
@using (Html.BeginForm("PostSelectedPerson", "Person", FormMethod.Post))
            {
                <tbody>
                    @for (int i = 0; i < Model.People.Count; i++)
                    {
                    <tr>
                        <td><input type="checkbox" name="@Model.People[i].IsSelected" value="true" checked /></td>
                        @Html.HiddenFor(model => model.People[i].IsSelected)
                        <td>
                            @Model.People[i].Id
                        </td>
                    </tr>
                        <input type="submit" value="Submit" name="Submit" />
                    }
                </tbody>
            }

还有一个Action,用来传递更新的Collection模型。

     [HttpPost]
     public IActionResult PostSelectedPerson(Collection c)
        {
           //return something.
        }

视图被填充,但当表单提交时,Action得到的是一个空的Collection.我希望Collection有一个Person的列表,对那些有复选框标记的人,isSelected设置为true。

forms asp.net-core razor model-binding
1个回答
0
投票

视图被填充了,但是当表单提交时,动作得到的是一个空的集合。

如果你想同时包含 IdIsSelected 在formdata中的信息,并将其发布到行动中,请使用额外的隐藏的表单字段来实现。Id 属性,并指定 名称 属性来匹配自定义模型类的属性,这将有助于自动将值绑定到模型的属性上,如下图所示。

@using (Html.BeginForm("PostSelectedPerson", "Person", FormMethod.Post))
{
<table>
    <tbody>
        @for (int i = 0; i < Model.People.Count; i++)
        {
        <tr>
            <td>
                <input asp-for="@Model.People[i].IsSelected">
            </td>
            <td>
                @Model.People[i].Id
                <input type="hidden" name="People[@i].Id" value="@Model.People[i].Id" />
            </td>
            <td>
                @Model.People[i].Name
            </td>
        </tr>
        }
    </tbody>
</table>
<input type="submit" value="Submit" />
}

测试结果

enter image description here

我希望一个集合有一个Person的列表,对于那些标有复选框的人,isSelected设置为true。

如果你希望只有选中的人的数据被post到动作,你可以动态地生成populate formdata 基于选定的行,然后发出ajax请求,在JavaScript客户端上将其发布到你的动作中。

© www.soinside.com 2019 - 2024. All rights reserved.