ASP.NET MVC 用POST请求替代window.location.href GET请求的实现方案
调整方案
1. 控制器端修改
修改点:
- 将动作方法的请求特性从
[HttpGet]替换为[HttpPost] - 对齐参数命名,和前端传入的参数名保持一致(你原有代码中前端传递的参数名和控制器接收参数名不匹配,已同步修正)
- 保留原有的跳转逻辑即可,POST请求处理完成后返回RedirectToAction符合PRG(Post/Redirect/Get)模式规范
示例代码:
[HttpPost] public async Task<ActionResult> MoveItem(int id, string comment, string empData, string currentItem) { // 你的业务逻辑写在这里 return RedirectToAction("EditEmpManagemnt", "EmpManagement", new { id = id }); }
注意:如果你要保留控制器原有的参数名
decision和currentworkflow,只需要把前端传递的参数键对应改为decision和currentworkflow即可,不需要修改控制器代码。
2. JavaScript端修改
修改点:
- 原有的
window.location.href是GET请求,无法触发POST接口,替换为jQuery的POST AJAX请求 - 修正原有代码的笔误:
commentToSave未定义,改为你实际获取的评论变量commentValue - 修正请求路径和控制器方法名匹配的问题,你原有JS写的请求路径是
PushItem,和控制器方法名MoveItem不一致,已同步修正 - AJAX请求成功后再执行页面跳转逻辑
示例代码:
function MoveItem() { var empId = document.getElementById('EMP_ID').value; var commentValue = $("#RESPONSE").val(); // 修正原笔误:commentToSave改为commentValue if ($.trim(commentValue).length > 0) { showAjaxLoading(); var empData= "APPROVE"; // 如果控制器在Employee区域下,地址改为'/Employee/EmpManagement/MoveItem' var baseControllerUrl = '/EmpManagement/MoveItem'; // 发送POST请求 $.post(baseControllerUrl, { id: empId, comment: commentValue, empData: empData, currentItem: itemData // 注意itemData变量你需要保证在当前作用域可以访问到 }, function(res) { // 请求成功后跳转编辑页 window.location.href = '/EmpManagement/EditEmpManagemnt?id=' + empId; }).fail(function() { // 请求失败的处理逻辑 aet('提交失败,请重试', 'E'); hideAjaxLoading(); }); } else { aet('Please enter comments', 'E'); } }
补充说明:如果你使用的是ASP.NET Core且开启了防伪令牌验证,POST请求需要携带防伪参数,只需要在请求参数里加上
__RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val()即可。
内容的提问来源于stack exchange,提问作者vmb
相关产品推荐
相关产品推荐

