MVC Core - 模型绑定不会将viewmodel中的列表填充回控制器

时间:2018-02-25 18:09:48

标签: c# asp.net-mvc

这个问题似乎被问了很多。我在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属性的空值,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:0)

就视图而言,你正在做的一切正确:

  1. 迭代for循环中的元素
  2. 使用HTML帮助程序使用for循环的索引器
  3. 创建元素

    但是,您在视图模型中做错了什么:

    public IList<CoordinateViewModel> Coordinates;
    

    要使模型绑定起作用,您的视图模型需要公开要使用的模型绑定器的属性。在这种情况下,坐标是一个字段,而不是一个属性。将其更改为:

    public IList<CoordinateViewModel> Coordinates {get; set; } 
    

    现在您的模型绑定将起作用。