【问题标题】:Forms inside foreach loop MVCforeach 循环 MVC 中的表单
【发布时间】:2021-01-12 14:26:27
【问题描述】:

我遇到了 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.这里是控制器的代码

[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 });
}

【问题讨论】:

    标签: model-view-controller asp.net-core-mvc


    【解决方案1】:

    为什么不采集视图中实际发生变化的数据?

    模型绑定在源代码中查找名称模式 prefix.property_name。如果没有找到,它只查找不带前缀的property_name。在您的代码中,asp-for 标记助手将生成类似的名称:item.propertyName。它与后端模型不匹配。您可以使用[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...
    }
    

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 2021-05-28
      • 1970-01-01
      相关资源
      最近更新 更多