首页 > 解决方案 > 为什么数据不从视图传递到控制器

问题描述

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

@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是一个空数组 - 它的值发生了什么?我忽略了什么,或者我做错了什么?

标签: c#asp.net-mvcmodel-view-controllerrazor

解决方案


使用提交您只能发布一个视图模型,而不能发布其他任何内容,而且我认为在视图内创建 removeIds 没有任何意义,因为您没有选择任何内容。由于您使用的是表单和提交按钮,因此您的整个模型无论如何都会被提交,无论您是否使用 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");
}

PS。

如果您只想提交 Id,则必须使用 ancor 标签而不是表单,或者创建具有 id 数组的特殊视图模型。如果要在 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 获取所有住宿而不是这个。


推荐阅读