发送到Post Action的类为null

时间:2017-06-06 10:56:07

标签: asp.net-core http-post

我正在制作一个视图,其中显示了类(Machine)的所有记录,其中可以更新其某些属性。

为此,视图正在使用IEnumerable。这些是Get和Post方法:

获取:

public async Task<IActionResult> Test()
    {

        PopulateMachineTypeDropDownListStore();
        return View(await _context.Machines.AsNoTracking().ToListAsync());
    }

发表:

[HttpPost, ActionName("Test")]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> TestPost(int id, [Bind("Id,StoreID,PUnit,Status")] Machine machine)
    {
        if (id != machine.Id)
        {
            return NotFound();
        }
        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(machine);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!MachineExists(machine.Id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction("Index");
        }
        return View(machine);}

问题是发送到Post Action的类是null(几乎所有字段都是零或null除了Id)

public async Task<IActionResult> TestPost(int id, [Bind("Id,StoreID,PUnit,Status")] Machine machine)

问题:所以,我不知道如何纠正这个问题。视图中是否会缺少某些内容?

@model IEnumerable<Application.Models.Machine>
@{
    ViewData["Title"] = "Test";

}
@foreach (var item in Model)
{
    <form asp-action="Test" asp-route-id="@item.Id" method="post">
        <table class="table">
            <tbody>
            <tr>
                <td>
                    <input type="hidden" asp-for="@item.Id" />
                    <div class="form-group">
                        <div class="col-md-10">
                            <input asp-for="@item.MchName" readonly class="form-control" />
                            <span asp-validation-for="@item.MchName" class="text-danger"></span>
                        </div>
                    </div>
                </td>
                <td>
                    <div class="form-group">
                        <div class="col-md-10">
                            <select asp-for="@item.StoreID" class="form-control" asp-items="ViewBag.StoreID">
                            </select>
                            <span asp-validation-for="@item.StoreID" class="text-danger"></span>
                        </div>
                    </div>
                </td>
                <td>
                    <div class="form-group">
                        <div class="col-md-10">
                            <input type="number" max="10" step=".1" asp-for="@item.PUnit" class="form-control" />
                            <span asp-validation-for="@item.PUnit" class="text-danger"></span>
                        </div>
                    </div>
                </td>
                <td>
                    <div class="form-group">
                        <div class="col-md-10">
                            <select name="Status" asp-for="@item.Status" class="form-control">
                                <option value="0">Operativo</option>
                                <option value="1">Nuevo Item</option>
                                <option value="2">Reparación</option>
                            </select>
                            <span asp-validation-for="@item.Status" class="text-danger"></span>
                        </div>
                    </div>
                </td>
                <td>
                    <input id="submit-data" type="submit" value="Update" class="btn btn-default" />
                </td>
            </tr>
        </tbody>
    </table>

</form>}

提前致谢

1 个答案:

答案 0 :(得分:1)

由于ModelBinder使用绑定的命名约定,请尝试将machine方法的TestPost()参数重命名为item

 public async Task<IActionResult> TestPost(
            int id, [Bind("Id, StoreID, PUnit,Status")] Machine item)
    {
        //... 
    }

或者,在您的视图中,您可以将item变量重命名为machine,以使其与预期的参数名称匹配:

@foreach (var machine in Model)
{ ...  }

docs概括地描述了这个:

  

模型绑定查找模式parameter_name.property_name以将值绑定到属性

最后,在“状态”下拉列表中省略name属性,这会阻碍模型绑定。让asp-for完成工作:

<select asp-for="@item.Status" class="form-control">

我真的不知道你如何填写商店下拉列表,但至少应该看到PUnitStatus属性以这种方式填充。