我是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。
视图被填充了,但是当表单提交时,动作得到的是一个空的集合。
如果你想同时包含 Id
和 IsSelected
在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" />
}
测试结果
我希望一个集合有一个Person的列表,对于那些标有复选框的人,isSelected设置为true。
如果你希望只有选中的人的数据被post到动作,你可以动态地生成populate formdata
基于选定的行,然后发出ajax请求,在JavaScript客户端上将其发布到你的动作中。