为啥数据不从视图传递到控制器
Posted
技术标签:
【中文标题】为啥数据不从视图传递到控制器【英文标题】:Why is data not passed from view to controller为什么数据不从视图传递到控制器 【发布时间】:2021-11-29 13:06:39 【问题描述】:我有一个 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 接收到正确的值。
Remove 按钮单击正确调用 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 是一个空数组 - 它的值发生了什么变化?我忽略了什么,或者我做错了什么?
【问题讨论】:
你需要在RemoveAccomodation
方法之上声明这样的路由[Route("<ControllerName>/removeIds:int[]")]
【参考方案1】:
使用提交您只能发布视图模型,而不能发布其他任何内容,我认为在视图内创建 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 获取所有住宿。
【讨论】:
是的,这是有道理的——我猜是生活'n'学习。 ? 知道为什么model
参数中的 Accomodations 可能为空,即使视图显示了几个?
您建议使用锚标记仅提交 Id 效果很好 - 但返回模型会使代码更优雅。
@Cooz 我更新了我的答案,见 PS2以上是关于为啥数据不从视图传递到控制器的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Asp.net web api 控制器不从 IController 派生
当数据从一个视图控制器传递到另一个视图控制器时,我如何能够传递图像?