foreach 循环 MVC 中的表单
Forms inside foreach loop MVC
我遇到 MVC 控制器已发送记录列表的情况。
这些记录显示在视图中,以便每条记录都是一个表格,因此可以逐条记录发布。
@model IList<FMS.Application.Models.TransferLineUpdateResponse>
@{
ViewData["Title"] = "Transfer Lines Page";
}
<div class="row">
<div class="col-12">
@foreach (var item in Model)
{
<form method="post" class="form-inline">
<div class="form-group">
<input type="hidden" asp-for="@item.Id" readonly class="form-control" />
<input type="hidden" asp-for="@item.TransferHeaderId" readonly class="form-control" />
</div>
<div class="form-group">
<label asp-for="@item.Item"></label>
<input asp-for="@item.Item" readonly class="form-control" />
</div>
<div class="form-group">
<label asp-for="@item.ToLocationId"></label>
<select class="form-control" asp-for="@item.ToLocationId" asp-items="ViewBag.ToLocations"></select>
</div>
<div class="form-group">
<input type="submit" asp-route-status="Accepted" class="btn btn-success" /> |
<input type="submit" asp-route-status="Rejected" class="btn btn-danger" />
</div>
</form>
}
</div>
</div>
当单击两个按钮之一并调用表单提交时,作为控制器中的参数,我的所有记录(如 Id、ToLocationId)都是 null 或空 guid,以防 属性 具有类型 guid。为什么不获取实际已更改的数据?
问候
P.S.here是controller的代码
[HttpGet("Transfer/Details/{id}")]
public async Task<IActionResult> Details(Guid id)
{
var lines = await _transferLineService.GetTransferLines(id);
var locations = await _locationService.GetLocations();
var customLocations = locations
.Where(w=>w.Code != "Tranzit")
.Select(s => new
{
Id = s.Id,
Description = $"{s.Code} - {s.Description}"
});
ViewBag.ToLocations = new SelectList(customLocations, "Id", "Description");
return View(lines);
}
[HttpPost("Transfer/Details/{transferHeaderId}")]
public async Task<IActionResult> AcceptDetails(Guid transferHeaderId, TransferLineUpdateResponse update)
{
var result = await _transferLineService.UpdateTransferLine(update);
await _transferHeaderService.UpdateTransferHeaderStatus(update.TransferHeaderId);
return RedirectToAction("Details",new { transferHeaderId = update.TransferHeaderId });
}
Why it is not taken data which has been actually changed in view ?
模型绑定在源中查找名称模式 prefix.property_name
。如果没有找到,它只查找 property_name
而没有 prefix.In 你的代码,asp-for
标签助手将生成如下名称:item.propertyName
。它无法与后端匹配model.You 可以使用 [Bind(Prefix ="item")]
指定前缀。
更改如下:
[HttpPost("Transfer/Details/{transferHeaderId}")]
public async Task<IActionResult> AcceptDetails(Guid transferHeaderId,[Bind(Prefix ="item")] TransferLineUpdateResponse update)
{
//do your stuff...
//_context.Update(update);
//await _context.SaveChangesAsync();
//your get method used [HttpGet("Transfer/Details/{id}")]
//so,it should be id not transferHeaderId
return RedirectToAction("Details", new { id = update.TransferHeaderId });//also change here...
}
结果:
我遇到 MVC 控制器已发送记录列表的情况。 这些记录显示在视图中,以便每条记录都是一个表格,因此可以逐条记录发布。
@model IList<FMS.Application.Models.TransferLineUpdateResponse>
@{
ViewData["Title"] = "Transfer Lines Page";
}
<div class="row">
<div class="col-12">
@foreach (var item in Model)
{
<form method="post" class="form-inline">
<div class="form-group">
<input type="hidden" asp-for="@item.Id" readonly class="form-control" />
<input type="hidden" asp-for="@item.TransferHeaderId" readonly class="form-control" />
</div>
<div class="form-group">
<label asp-for="@item.Item"></label>
<input asp-for="@item.Item" readonly class="form-control" />
</div>
<div class="form-group">
<label asp-for="@item.ToLocationId"></label>
<select class="form-control" asp-for="@item.ToLocationId" asp-items="ViewBag.ToLocations"></select>
</div>
<div class="form-group">
<input type="submit" asp-route-status="Accepted" class="btn btn-success" /> |
<input type="submit" asp-route-status="Rejected" class="btn btn-danger" />
</div>
</form>
}
</div>
</div>
当单击两个按钮之一并调用表单提交时,作为控制器中的参数,我的所有记录(如 Id、ToLocationId)都是 null 或空 guid,以防 属性 具有类型 guid。为什么不获取实际已更改的数据? 问候
P.S.here是controller的代码
[HttpGet("Transfer/Details/{id}")]
public async Task<IActionResult> Details(Guid id)
{
var lines = await _transferLineService.GetTransferLines(id);
var locations = await _locationService.GetLocations();
var customLocations = locations
.Where(w=>w.Code != "Tranzit")
.Select(s => new
{
Id = s.Id,
Description = $"{s.Code} - {s.Description}"
});
ViewBag.ToLocations = new SelectList(customLocations, "Id", "Description");
return View(lines);
}
[HttpPost("Transfer/Details/{transferHeaderId}")]
public async Task<IActionResult> AcceptDetails(Guid transferHeaderId, TransferLineUpdateResponse update)
{
var result = await _transferLineService.UpdateTransferLine(update);
await _transferHeaderService.UpdateTransferHeaderStatus(update.TransferHeaderId);
return RedirectToAction("Details",new { transferHeaderId = update.TransferHeaderId });
}
Why it is not taken data which has been actually changed in view ?
模型绑定在源中查找名称模式 prefix.property_name
。如果没有找到,它只查找 property_name
而没有 prefix.In 你的代码,asp-for
标签助手将生成如下名称:item.propertyName
。它无法与后端匹配model.You 可以使用 [Bind(Prefix ="item")]
指定前缀。
更改如下:
[HttpPost("Transfer/Details/{transferHeaderId}")]
public async Task<IActionResult> AcceptDetails(Guid transferHeaderId,[Bind(Prefix ="item")] TransferLineUpdateResponse update)
{
//do your stuff...
//_context.Update(update);
//await _context.SaveChangesAsync();
//your get method used [HttpGet("Transfer/Details/{id}")]
//so,it should be id not transferHeaderId
return RedirectToAction("Details", new { id = update.TransferHeaderId });//also change here...
}
结果: