ASP.NET可编辑网格:更新注册

时间:2017-05-28 05:45:29

标签: asp.net asp.net-mvc asp.net-core http-post

我一直在努力解决这个问题。我正在构建这个观点:

Update Multiple Items

但是当我在进行一些更改后点击“更新”按钮时,网页会刷新以显示原始值。

关于视图:我使用IEnumerable获取此视图,并通过表单内的模型中的每个项循环。然后,在表单内部,有一个只包含1行的表。我这样做是为了以一种形式包装记录的所有项目。这是代码的一部分:

@foreach (var item in Model)
        {
            <form asp-action="Test" asp-route-id="@item.Id">
                <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>
                            //more fields
                            <td>
                                <input type="submit" value="Update" class="btn btn-default" />
                            </td>
                         </tr>
                      </tbody>
                   </table>
                </form>}

我声明了一个asp-action和一个asp-route-id:

<form asp-action="Test" asp-route-id="@item.Id">

问题:这还不错吗?有什么遗失的吗?

这是获取方法:

    public async Task<IActionResult> Test()
    {
        PopulateMachineTypeDropDownListStore();
        return View(await _context.Machines.AsNoTracking().ToListAsync());
    }

问题:我没有向控制器传递任何参数,但视图将使用IEnumerable列出给定结构后面的项目。我应该将任何内容传递给Get方法还是它没有问题?

这是Post方法:

        @model IEnumerable<Application.Models.Machine>            

        [HttpPost, ActionName("Test")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> TestPost(int? id)
        {
            if (id == null)
        {
            return NotFound();
        }
        var machinetoUpdate = await _context.Machines
            .SingleOrDefaultAsync(s => s.Id == id);
        if (await TryUpdateModelAsync(
            machinetoUpdate,
            "",
            s => s.MchName, s => s.StoreID, s => s.PUnit, s => s.Status))
        {
            try
            {
                await _context.SaveChangesAsync();

            }
            catch (DbUpdateException)
            {
                ModelState.AddModelError("", "Unable to save changes. " +
                    "Try again, and if the problem persists, " +
                    "see your system administrator.");
            }
            return RedirectToAction("Test");
        }
        PopulateMachineTypeDropDownListStore();

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

问题:我不知道是否因为我从中检索id的实体(以及我用来通过TryUpdateModelAsync()更新模型)也用于比较模型通过视图,这可能无法正常工作。

提前感谢您的帮助。

0 个答案:

没有答案