Asp.Net Core 完成更新后弹窗提示再跳转其他页面不生效如何解决
问题根因
你当前的写法中,Response.WriteAsync 写入的脚本内容还没返回到客户端,后续的RedirectToAction会直接返回302重定向响应,浏览器收到302会直接跳转目标页面,根本不会执行你写入的JS脚本,所以看不到弹窗也无法按预期执行逻辑。
解决方案
方案1:前端脚本控制跳转(快速实现)
直接在返回的脚本里加入跳转逻辑,不需要用服务端重定向,代码修改如下:
[HttpPost("Home/Edit/{id}")] [ValidateAntiForgeryToken] public ActionResult Edit(int id, IFormCollection collection) { try { /*业务逻辑代码*/ // 直接返回包含弹窗+跳转逻辑的内容,不要用RedirectToAction return Content($"<script>alert('successfully updated');location.href='{Url.Action(nameof(List))}'</script>", "text/html; charset=utf-8"); } catch { return View(); } }
注意:如果提示内容包含用户输入的动态内容,需要做XSS转义,避免脚本注入风险
方案2:TempData传递消息(更符合MVC规范)
把提示消息存在TempData中,服务端正常重定向,在目标页面判断是否有提示消息再弹出,实现逻辑和视图分离。
控制器代码修改:
[HttpPost("Home/Edit/{id}")] [ValidateAntiForgeryToken] public ActionResult Edit(int id, IFormCollection collection) { try { /*业务逻辑代码*/ TempData["AlertMsg"] = "successfully updated"; return RedirectToAction(nameof(List)); } catch { return View(); } }
List视图添加弹窗逻辑:
在List对应的Razor视图中加入以下代码:
@if (TempData["AlertMsg"] != null) { <script> alert('@TempData["AlertMsg"]'); </script> }
说明:TempData默认是单次请求有效,跳转后读取一次就会自动销毁,刚好匹配这类操作提示的场景,不需要手动清理数据
内容的提问来源于stack exchange,提问作者Selim Sonmez
相关产品推荐
相关产品推荐

