ASP.NET Core MVC使用RedirectToAction后视图未刷新怎么解决?
问题原因
你使用$.get()发送的是异步AJAX请求,浏览器的AJAX引擎会自动处理后端返回的302重定向响应,主动请求重定向后的Index地址、拿到对应页面内容,但不会触发当前页面的整页刷新或者DOM内容更新,因此视觉上页面没有任何变化。
解决方法
方案1:替换AJAX为页面跳转(最简方案)
直接修改前端JS逻辑,通过修改window.location触发整页跳转,浏览器会自动识别后端返回的重定向响应完成页面刷新:
function executeInsert() { window.location.href = '/Home/Update'; }
方案2:适配AJAX场景,前端手动处理跳转
如果必须保留AJAX请求逻辑,可以修改前后端交互逻辑,前端收到响应后手动触发跳转:
- 修改后端
Update方法,返回重定向地址而非直接返回302响应:
public IActionResult Update() { return Json(new { redirectUrl = Url.Action("Index", new { name = "Steven", desc="Hello" }) }); }
- 修改前端JS逻辑,拿到返回的跳转地址后手动触发页面跳转:
function executeInsert() { $.get('/Home/Update', function(res) { window.location.href = res.redirectUrl; }); }
如果不需要整页刷新,也可以将Index改为返回部分视图,前端拿到视图内容后替换当前页面对应DOM节点实现局部更新。
可选优化
你当前代码中每次请求Index都新建Random实例,短时间内发起多次请求时可能生成重复的随机ID,建议将Random提升为控制器类的全局成员:
public class HomeController : Controller { private readonly Random _random = new Random(); public IActionResult Index(string name, string desc) { TestViewModel viewModel = new TestViewModel(); viewModel.Id = _random.Next(0,7).ToString(); viewModel.Name = name; viewModel.desc = desc; return View(viewModel); } // 其余代码保持不变 }
内容的提问来源于stack exchange,提问作者Xie Steven
相关产品推荐
相关产品推荐

