Ajax调用GetApps后Redirect跳转失效,return View无法触发页面跳转问题
问题根本原因
你这个问题的核心是 AJAX请求默认由浏览器XMLHttpRequest对象异步处理,不会自动响应服务端的302重定向指令,也不会自动刷新/跳转页面,服务端返回的RedirectToAction本质是给请求方返回302状态码+目标地址,AJAX收到后只会默认跟进重定向拿到Apps方法返回的HTML内容,不会触发浏览器全局页面跳转,所以你看不到页面变化。
其他代码隐患
- 参数传递逻辑冗余:你已经把序列化后的应用列表存在
TempData["Applicaitons"]里了,RedirectToAction的时候完全没必要再传model参数,而且你直接把List<ApplicationViewModel>类型丢到路由参数里会被自动ToString(),传到Apps方法的时候根本没法正确绑定为ApplicationViewModel类型,虽然你现在是读TempData没用到这个参数,但属于无效写法。 - 拼写错误:TempData的键名你写的是
Applicaitons,正确拼写应该是Applications,如果后续其他地方用正确拼写读取会读不到值。 - 异步调用阻塞:
_dashboardService.GetApp看起来是异步方法,你直接用.Result调用会有线程阻塞、死锁的风险,建议改成await调用,同时把GetApps方法修改为异步public async Task<IActionResult> GetApps(string customerId)。
修复方案
你可以根据业务场景二选一:
方案1:不用AJAX,改用普通表单提交GetApps
如果不需要异步交互效果,直接用form表单提交customerId到GetApps接口,浏览器原生提交会自动处理302重定向,跳转到Apps页面加载View。
方案2:保留AJAX,前端手动处理跳转
GetApps接口不返回RedirectToAction,直接返回Apps页面的地址给前端,前端AJAX拿到地址后手动执行页面跳转:
后端修改:
[HttpPost] public async Task<IActionResult> GetApps(string customerId) { ApplicationResponse apps = new ApplicationResponse(); // 改成await调用异步方法 var result = await _dashboardService.GetApp(Guid.Parse(customerId)); apps.Applications = result.Data.Applications; TempData["Applications"] = JsonSerializer.Serialize(apps.Applications); // 直接返回跳转地址 return Ok(Url.Action("Apps", "Home")); }
前端AJAX回调修改:
$.ajax({ url: '/Home/GetApps', type: 'POST', data: {customerId: '你的客户ID'}, success: function(res) { // 手动跳转页面 window.location.href = res; } })
对应Apps方法简化:
public IActionResult Apps() { var apps = JsonSerializer.Deserialize<List<ApplicationViewModel>>(TempData["Applications"].ToString()); return View("/Home/Apps", apps); }
内容的提问来源于stack exchange,提问作者burak ramazan
相关产品推荐
相关产品推荐

