繁体   English   中英

为什么数据没有从视图传递到 controller

[英]Why is data not passed from view to controller

我有一个 Razor 视图,在表格中列出了假日公园住宿。 用户(公园管理员)决定删除这些内容,现在按下“删除”按钮。 然后必须将所有列出的住宿的 ID 传递给 controller,但不知何故它们没有到达,我无法确定为什么没有。 这是视图的代码:

@model SunnySideWebManagement.ViewModels.HomeAccomodationsViewModel

@{
    ViewBag.PageTitle = "Remove these accomodations?";
    int[] removeIds = new int[Model.Accomodations.Count()];
}

<form asp-controller="home" asp-action="removeaccomodation" asp-route-removeIds="@removeIds" method="post" class="mt-10">
    <div class="form-group row">
        <table id="accomodationsTable" class="row-border">
            <thead>
                <tr><th>Id</th><th>Number</th><th>Remarks</th><th>Currently booked</th></tr>
            </thead>
            <tbody>
                @{
                    int index = 0;
                    foreach (var ac in Model.Accomodations)
                    {
                        removeIds[index] = ac.Id;
                        index++;
                        <tr><td>@ac.Id</td><td>Number</td><td>@ac.Remarks</td><td>@ac.CurrentlyBooked</td></tr>
                    }
                }
            </tbody>
        </table>
    </div>
    <div class="form-group row">
        <div class="col-sm-10">
            <button type="submit" class="btn btn-primary">Remove</button>
            <a asp-controller="home" asp-action="accomodations" class="btn btn-primary">Cancel</a>
        </div>
    </div>
</form>

如您所见,我声明了一个 int 数组removeIds并在表格填满时非常简单地填充它。 removeIds收到正确的值。 删除按钮单击正确调用HomeController.cs中的以下代码,如<form...>元素中所定义:

[HttpPost]
public IActionResult RemoveAccomodation(int[] removeIds)
{
    for (int i = 0; i < removeIds.Length; i++)
    {
        _accomodationRepository.Delete(removeIds[i]);
    }
    return RedirectToAction("accomodations");
}

此处的断点显示removeIds是一个空数组 - 它的值发生了什么变化? 我忽略了什么,或者我做错了什么?

使用提交你只能发布一个视图 model 而不是其他任何东西而且我认为在视图内创建 removeIds 没有任何意义,因为你没有选择任何东西。 由于您使用的是表单和提交按钮,因此无论如何都会提交整个 model,无论您是否使用 asp-route 都没有关系。 因此删除 asp-route-removeIds="@removeIds" 并修复操作。

[HttpPost]
public IActionResult RemoveAccomodation(HomeAccomodationsViewModel  model)
{
int[] removeIds = Model.Accomodations.Select(i=> i.Id).ToArray();

 for (int i = 0; i < removeIds.Length; i++)
    {
        _accomodationRepository.Delete(removeIds[i]);
    }
    return RedirectToAction("accomodations");
}

附言。

如果您只想提交 ID,则必须使用 ancor 标签而不是表单,或者创建一个带有 ID 数组的特殊视图 model。 如果你想在ancor中使用id,你必须在创建ancor之前填写所有的Id,或者使用javascript。但是你现在的代码没有多大意义。

PS2

如果您仍想返回所有住宿项目,则必须使用 for 循环而不是 foreach 循环

  @for (var i=0; i <  Model.Accomodations.Count; i++)
 {
                      
 <tr><td>@Model.Accomodations[i].Id</td><td>Number</td>
<td>@Model.Accomodations[i].Remarks</td>
<td>@Model.Accomodations[i].CurrentlyBooked</td></tr>
 }

但除此之外,您还可以仅使用 I 从 db 获取所有住宿。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM