控制器AndraStatus方法无法接收视图传递的orderId问题求助
问题分析与解决方案
核心原因是HTML规范不允许表单嵌套,你的视图中外层已定义了指向AndraStatus方法的表单,但内部又嵌套了另一个表单。浏览器会自动修正这种无效的DOM结构,导致实际提交的是内层表单——而内层表单既没有指定目标action,也未包含nyStatus参数,同时外层表单的配置被完全忽略,最终造成orderId无法正确传递到控制器。
修复步骤
1. 移除表单嵌套,合并提交逻辑
删除内层的<form>标签,将隐藏域和提交按钮直接放到外层表单内部,确保所有需要提交的字段都在同一个合法表单中:
@if (User.Identity.IsAuthenticated) { <form asp-controller="Order" asp-action="AndraStatus" method="post"> <div class="form-group"> <label for="nyStatus">Välj ny status:</label> <select class="form-control" id="nyStatus" name="nyStatus"> @foreach (var status in Enum.GetValues(typeof(OrderStatus))) { <option value="@status">@status</option> } </select> </div> <input type="hidden" name="orderId" value="@order.Id"> <button type="submit" class="btn btn-primary">Uppdatera status</button> </form> }
2. 验证参数绑定一致性
确认表单字段的name属性与控制器方法的参数名称完全匹配:
- 隐藏域
name="orderId"↔ 控制器参数int orderId - 下拉框
name="nyStatus"↔ 控制器参数OrderStatus nyStatus
当前控制器代码的参数命名是匹配的,ASP.NET Core会自动完成绑定,无需额外修改。
3. 额外验证点
- 临时在视图中输出
@order.Id,确认渲染后的HTML里隐藏域的value属性是否为预期的订单ID值; - 提交表单时,打开浏览器开发者工具的网络面板,检查请求的Form Data中是否包含
orderId和nyStatus两个参数,以此确认表单数据是否正确发送。
内容的提问来源于stack exchange,提问作者HzR
相关产品推荐
相关产品推荐

