我一直在努力解决这个问题。我正在构建这个观点:
但是当我在进行一些更改后点击“更新”按钮时,网页会刷新以显示原始值。
关于视图:我使用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()更新模型)也用于比较模型通过视图,这可能无法正常工作。
提前感谢您的帮助。