ASP.NET WebForm页面跳转时出现Invalid JSON primitive错误求助
解决ASP.NET WebForm母版页跳转时的"Invalid JSON primitive"错误
问题根源分析
这类错误大多是因为页面跳转时,原页面中Rad控件的AJAX请求未正常终止、残留的控件状态与母版页请求上下文冲突,或是Handler返回的JSON被意外篡改导致解析失败。
具体解决方案
清理复制控件的AJAX绑定与状态
复制RadGrid/RadHtmlChart到目标div后,必须移除原控件的AJAX相关配置和事件绑定,避免页面跳转时残留的JS逻辑尝试发送不完整请求:// 处理RadGrid var originalGrid = $find("<%= RadGrid1.ClientID %>"); if (originalGrid) { originalGrid.get_masterTableView().set_ajaxSettings(null); $telerik.$(originalGrid.get_element()).off("ajaxRequest"); } // 处理RadHtmlChart var originalChart = $find("<%= RadHtmlChart1.ClientID %>"); if (originalChart) { originalChart._dataSource = null; $telerik.$(originalChart.get_element()).off("dataBinding"); }跳转前终止所有未完成的AJAX请求
在母版页的导航操作触发前,主动终止当前页面所有pending的异步请求,防止不完整的JSON数据被错误解析:function cancelPendingRequests() { // 终止ASP.NET AJAX请求 var prm = Sys.WebForms.PageRequestManager.getInstance(); if (prm.get_isInAsyncPostBack()) { prm.abortPostBack(); } // 终止Telerik的AJAX请求 $telerik.xhr.abortAll(); }给母版页的导航按钮添加点击事件:
onclick="cancelPendingRequests();"确保Handler返回标准JSON格式
检查Handler的ProcessRequest方法,用专业序列化库生成严格格式的JSON,同时清除响应缓冲区避免多余输出:public void ProcessRequest(HttpContext context) { context.Response.ContentType = "application/json"; var data = GetGridAndChartData(); // 使用Newtonsoft.Json生成标准JSON string json = JsonConvert.SerializeObject(data); context.Response.Clear(); context.Response.Write(json); context.Response.End(); }复制渲染后的静态内容而非完整控件DOM
不要直接复制Rad控件的整个DOM结构,只复制其渲染后的静态HTML,减少控件状态冲突:// 复制RadGrid渲染后的内容 $telerik.$("#targetGridDiv").html($telerik.$("#<%= RadGrid1.ClientID %>").html()); // 复制RadHtmlChart渲染后的内容 $telerik.$("#targetChartDiv").html($telerik.$("#<%= RadHtmlChart1.ClientID %>").html());
内容的提问来源于stack exchange,提问作者Anuj Karki
相关产品推荐
相关产品推荐

