TempData内容无法在JavaScript弹窗中显示的问题求助
问题:Ajax请求后无法通过TempData显示弹窗内容
点击按钮调用Ajax请求控制器方法后,弹窗无内容;修改写法后弹窗甚至不显示,相关代码如下:
按钮代码
<a style="float: right; margin-bottom:20px" asp-action="Verify" class="Button btn btn-primary" onclick="test();">Verify Document</a>
控制器及前端JS代码
public JsonResult Verify() { StringBuilder sb = new StringBuilder(); sb.Append("<b> Verification Failed </b>"); sb.Append("<Br/>"); sb.Append("This document is not a valid electronic reproduction of a record on file"); sb.Append("<Br/>"); TempData["Message"] = sb.ToString(); return Json(new { msg = "saved" }); }
function test() { var dialog = $('#dialog').data("kendoDialog"); $.ajax({ type: "POST", url: '@Url.Action("Verify", "Home")', success: function (result) { if (result.msg == "saved") { alert('@Html.Raw((string)TempData["Message"])') } } }); }
问题原因
- Razor语法是服务器端渲染:页面加载时
@TempData["Message"]就会被服务器解析,此时还未调用Verify方法,TempData["Message"]为空,最终生成的JS代码是alert(''),显示空弹窗;如果直接写@TempData["Message"],解析后可能生成无效代码导致JS报错,弹窗无法显示。 - TempData不适合Ajax场景:TempData是用于服务器端重定向时传递临时数据的,Ajax是客户端异步请求,请求完成后服务器端设置的TempData无法回写到已加载完成的页面中。
解决方案
直接将需要返回的消息包含在Json结果中,不要使用TempData:
修改后的控制器代码
public JsonResult Verify() { StringBuilder sb = new StringBuilder(); sb.Append("<b> Verification Failed </b>"); sb.Append("<Br/>"); sb.Append("This document is not a valid electronic reproduction of a record on file"); sb.Append("<Br/>"); // 将消息直接放入返回的Json对象 return Json(new { msg = "saved", message = sb.ToString() }); }
修改后的前端JS代码
function test() { var dialog = $('#dialog').data("kendoDialog"); $.ajax({ type: "POST", url: '@Url.Action("Verify", "Home")', success: function (result) { if (result.msg == "saved") { // 直接使用返回的message字段 alert(result.message); // 如果需要显示HTML格式内容,推荐使用Kendo Dialog替代alert: // dialog.content(result.message); // dialog.open(); } } }); }
内容的提问来源于stack exchange,提问作者rimi
相关产品推荐
相关产品推荐

