c# - 为什么数据不从视图传递到控制器
问题描述
我有一个 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是一个空数组 - 它的值发生了什么?我忽略了什么,或者我做错了什么?
解决方案
使用提交您只能发布一个视图模型,而不能发布其他任何内容,而且我认为在视图内创建 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 获取所有住宿而不是这个。
推荐阅读
- python - 卷积神经网络中的输入和输出形状
- bash - 为什么有些脚本与 #! /bin/sh 和一些带有 #! /bin/ksh 在 Solaris 机器上?
- git - 如何解释 git reset --soft && git checkout 的行为
- excel - Access/Excel/VBA 中的日期到 Weeknum
- flutter - FirebaseDynamicLinks getInitialLink() 多次触发
- google-apps-script - GmailApp.getInboxThreads() 跳过电子邮件
- mysql - 查询以显示不同的组合,然后显示每个不同组合的计数
- xcode12 - Xcode 12 分支的名称不完全可见
- jspdf - 如何在JsPDF中将文本放在矩形内
- vue.js - Ionic CLI 版本和 Ionic 版本的区别