You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Razor视图中的ID数组无法传递到ASP.NET Core控制器

问题根源

你在form标签上通过asp-route-removeIds="@removeIds"传数组的写法是无效的。Razor渲染页面时,会对路由参数调用ToString()方法,你传的int数组最终会被转为"System.Int32[]"字符串,不会携带任何实际的ID值,后端自然绑定不到有效数据。
另外你在视图代码块里声明的removeIds数组是服务器端渲染时的临时变量,页面渲染完成后就会被销毁,不可能跟着前端提交请求传到后端,你需要把要提交的ID输出到表单的可提交元素里。


解决方案

方案1:表单隐藏域提交(改动最小)

不需要修改后端代码,仅调整视图逻辑即可:

  1. 删掉form标签里的asp-route-removeIds="@removeIds"属性
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:45:03