在表单上的输入上使用“禁用”属性不会发布它们,这是预期和想要的。但是,如果您在列表中准备一个3个对象的表单,禁用第一个和第三个,并提交,第二个对象出现在帖子标题中,但没有正确绑定到列表,因为它有一个索引[1]而不是[0]。
我理解模型绑定是如何工作的以及为什么它不绑定我想要的发布对象,但我不知道如何描述问题以获得特定结果,这将导致我的解决方案。我搜索的任何内容都会导致基本的帖子和绑定示例。
列出我正在使用的模型:
public IList<_Result> Results { get; set; }
类_Result具有以下属性之一:
public string Value { get; set; }
我填写列表并在视图中使用它如下:
@for (int i = 0; i < Model.Results.Count; i++)
{
...
<td>
<input asp-for="Results[i].Value" disabled />
</td>
...
}
我在表单上有复选框,它从输入中删除(使用javascript)“禁用”属性,从而允许它们被发布。
当我用3个_Result对象填充所述列表时,它们显示在表单上,并且都具有“禁用”属性。如果我从前两个对象中删除“disabled”属性并单击“提交”按钮,我会收到带有前2个_Result对象的“结果”列表,这是预期的。
但是,如果仅从第二个_Result对象中删除“disabled”属性(第一个_Result对象仍具有“disabled”属性),则结果列表在我的Controller方法中返回空。在我的表格数据标题中,我看到:“结果[1]。值:我想要发布的值”,这意味着发布了帖子,但由于索引,列表不绑定对象。
关于如何实现正确绑定的任何想法?另外,我使用“禁用”属性的原因是因为我在一个页面上显示了很多结果,并且只想发布那些被选中的结果。
要获取所选项目,您可以尝试使用View Model复选框,而不是使用jquery来控制disable属性。
public class ModelBindVM
{
public IList<_ResultVM> Results { get; set; }
}
public class _ResultVM
{
public bool IsSelected { get; set; }
public string Value { get; set; }
}
[HttpGet]
public IActionResult ModelBindTest()
{
ModelBindVM model = new ModelBindVM
{
Results = new List<_ResultVM>() {
new _ResultVM{ Value = "T1" },
new _ResultVM{ Value = "T2" },
new _ResultVM{ Value = "T3" }
}
};
return View(model);
}
[HttpPost]
public IActionResult ModelBindTest(ModelBindVM modelBind)
{
return View();
}
<div class="row">
<div class="col-md-4">
<form asp-action="ModelBindTest">
@for (int i = 0; i < Model.Results.Count; i++)
{
<input type="checkbox" asp-for="Results[i].IsSelected" />
<label asp-for="@Model.Results[i].IsSelected">@Model.Results[i].Value</label>
<input type="hidden" asp-for="@Model.Results[i].Value" />
}
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>