IEnumerable

时间:2017-05-22 05:36:18

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

Objetive:保存在网格上编辑过的多个项目。

问题:不知道如何定义帖子方法。

您好,

我有一个网格/表寄存器我呈现给用户供他更新。这是观点:

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

}

<h2>Management</h2>
<hr />
<table class="table">
    <thead>
        <tr>
            <th>Serial</th>
            <th>Store</th>
</tr>
</thead>
<tbody>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                <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">
                            <option value="">-- Seleccione Tienda --</option>
                        </select>
                        <span asp-validation-for="@item.StoreID" class="text-danger"></span>
                    </div>
                </div>
            </td>
 </tr>
 }
</tbody>
</table>

 <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>

一旦编辑完毕,就应保存并修改寄存器,但我不知道如何在IEnumerable的情况下定义POST方法。

关注Ibro评论:

我已经完成了这个,首先是一个包含该模型的IEnumerable的新类:

public class EditMachineViewModel
{
    public IEnumerable<Application.Models.Machine> Machines { get; set; }
}

Sidenote Altough我将IEnumerable公开而不是私有。

至于第二部分,我用这种方式定义了POST方法:

[HttpPost, ActionName("Test")]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Test(EditMachineViewModel model)
    {
        var machinestoUpdate = await _context.Machines;
        if (await TryUpdateModelAsync(
            machinestoUpdate,
            "",
            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("Index");
        }
    }

这里发生了一些事情:

1 在这一行:

public async Task<IActionResult> Test(EditMachineViewModel model)

错误消息:&#39; MachinesController.Test(EditMachineViewModel)&#39;:并非所有代码路径都返回值

但是,这还没有完成,所以显示错误是很自然的。

2 在这一行:

var machinestoUpdate = await _context.Machines;

错误消息:&#39; DbSet没有&#39; GetAwaiter&#39;的定义,但实际上(按照旧示例)此行应以以下结尾:

.SingleOrDefaultAsync(s => s.Id == id);

但我不认为我可以使用它,因为我没有传递ID。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您应该为POST使用单独的方法(操作):

        [HttpGet, ActionName("Edit")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditPost(int? id)

        [HttpPost, ActionName("Edit")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> EditPost(EditMachineViewModel model)

public class EditMachineViewModel
{
    public IEnumerable<Application.Models.Machine> Machines { get; set; }
}