为什么Razor视图中的ID数组无法传递到ASP.NET Core控制器
问题根源
你在form标签上通过asp-route-removeIds="@removeIds"传数组的写法是无效的。Razor渲染页面时,会对路由参数调用ToString()方法,你传的int数组最终会被转为"System.Int32[]"字符串,不会携带任何实际的ID值,后端自然绑定不到有效数据。
另外你在视图代码块里声明的removeIds数组是服务器端渲染时的临时变量,页面渲染完成后就会被销毁,不可能跟着前端提交请求传到后端,你需要把要提交的ID输出到表单的可提交元素里。
解决方案
方案1:表单隐藏域提交(改动最小)
不需要修改后端代码,仅调整视图逻辑即可:
- 删掉form标签里的
asp-route-removeIds="@removeIds"属性 - 在form内部加一组name为
removeIds的隐藏输入框,每个对应一个要删除的ID,ASP.NET Core的模型绑定会自动把同名的多个值拼接为数组传入Action。
修改后的视图代码示例:
@model SunnySideWebManagement.ViewModels.HomeAccomodationsViewModel @{ ViewBag.PageTitle = "Remove these accomodations?"; } <form asp-controller="home" asp-action="removeaccomodation" method="post" class="mt-10"> <!-- 输出所有要提交的ID隐藏域 --> @foreach (var ac in Model.Accomodations) { <input type="hidden" name="removeIds" value="@ac.Id" /> } <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> @foreach (var ac in Model.Accomodations) { <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>
方案2:AJAX提交(适合无刷新提交场景)
如果需要页面不跳转提交,可以用AJAX传递JSON格式的数组,需要同时调整前后端代码:
前端JS示例:
let removeIds = []; // 收集表格里的所有住宿ID document.querySelectorAll('#accomodationsTable tbody tr td:first-child').forEach(td => { removeIds.push(parseInt(td.textContent)); }); fetch('/home/removeaccomodation', { method: 'POST', headers: { 'Content-Type': 'application/json', 'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value }, body: JSON.stringify(removeIds) }).then(res => window.location.href = '/home/accomodations');
后端Action调整(加[FromBody]注解):
[HttpPost] public IActionResult RemoveAccomodation([FromBody] int[] removeIds) { for (int i = 0; i < removeIds.Length; i++) { _accomodationRepository.Delete(removeIds[i]); } return RedirectToAction("accomodations"); }
内容的提问来源于stack exchange,提问作者Cooz
相关产品推荐
相关产品推荐

