这个问题似乎被问了很多。我在StackOverflow上找到了关于此的所有内容,据我所知,我正在做我应该做的所有事情,以确保视图正确迭代列表元素并为它们创建适当的html。然而,模型绑定不起作用。
我有这两种视图模型:
public class ProjectViewModel
{
public int ProjectId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int? StatusId { get; set; }
public IList<CoordinateViewModel> Coordinates;
}
public class CoordinateViewModel
{
public int CoordinateId { get; set; }
public double X { get; set; }
public double Y { get; set; }
}
在视图中使用它们(为便于阅读而简化):
@model ProjectViewModel
<div class="container">
<form asp-action="Edit" method="post">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="row">
Coordinates
<table>
<thead>
<tr>
<th></th>
<th>X</th>
<th>Y</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.Coordinates.Count; i++)
{
<tr>
<td>@Html.HiddenFor(x => Model.Coordinates[i].CoordinateId)</td>
<td>@Html.TextBoxFor(x => Model.Coordinates[i].X)</td>
<td>@Html.TextBoxFor(x => Model.Coordinates[i].Y)</td>
</tr>
}
</tbody>
</table>
</div>
<div class="row">
<div class="col-md-8 form-group">
<label asp-for="Description" class="control-label"></label>
<textarea asp-for="Description" class="form-control"></textarea>
<span asp-validation-for="Description" class="text-danger"></span>
</div>
</div>
<div class="row">
<div class="form-group">
<div class="col-md-offset-2 col-md-5">
<input type="submit" class="btn btn-primary" value="Submit" />
</div>
</div>
</div>
</form>
</div>
涉及的控制器操作就是这一个(为了便于阅读,再次编辑):
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(ProjectViewModel viewModel)
{
return View(viewModel);
}
加载表单时,将填充坐标信息。
提交表单时,控制器的action方法中的视图模型包含Coordinates属性的空值,我无法弄清楚原因。
答案 0 :(得分:0)
就视图而言,你正在做的一切正确:
但是,您在视图模型中做错了什么:
public IList<CoordinateViewModel> Coordinates;
要使模型绑定起作用,您的视图模型需要公开要使用的模型绑定器的属性。在这种情况下,坐标是一个字段,而不是一个属性。将其更改为:
public IList<CoordinateViewModel> Coordinates {get; set; }
现在您的模型绑定将起作用。