我尝试发送从GridDataItem
的选定行中检索到的RadGrid
个对象。
但是,当我进行此AJAX调用时,我收到未捕获的RangeError:最大调用堆栈大小错误:
编辑:当我运行代码时,我的AJAX成功触发,但我在WebMethod上的断点从未发生过。在此之后,页面暂时冻结,然后我得到上面提到的错误。
的jQuery
$(document).ready(function () {
$('#<%=btnTransferIn.ClientID%>').on('click', function () {
var grid = $find("<%= gridStudents.ClientID %>"); //Returns an Object
var gridSelItems = grid.get_selectedItems(); //Returns Array
//var selectedItem = gridSelItems[0]; //Returns an Object
AjaxTransfer(gridSelItems);
});
});
function AjaxTransfer(selectedItem) {
$.ajax({
type: "POST",
url: "GradeSheet2.aspx/btnTransferIn_Click",
data: { 'gsi': selectedItem },
dataType: "json",
contentType: "application/json; charset=utf-8",
success: alert('Complete')
})
}
C#
[System.Web.Services.WebMethod]
public static string btnTransferIn_Click(GridDataItem gsi)
{
return "Done";
}
的web.config
<?xml version="1.0"?>
<configuration>
<configSections>
</configSections>
<appSettings>
<add key="AISAnalogPATH" value="\\tms-sse-01\tms_share\cbtExecutables\" />
<add key="ExternalCAIPath" value="\\tms-sse-01\tms_share\cbtExecutables\" />
<add key="AISDigitalPath" value="\\tms-sse-01\tms_share\cbtExecutables\" />
<add key="AuthorwarePath" value="\\tms-sse-01\tms_share\cbtExecutables\" />
<add key="QuestionMarkPath" value="\\tms-sse-01\tms_share\cbtExecutables\" />
<add key="WelcomeMessage" value="Welcome to the TMS 2016 Program"/>
<add key="Location" value="STL"/>
<add key="TMSPagesConnectionString" value="server=tms-sse-01;User ID=xcv;Password=mumumu777;Initial Catalog=qwer12344567;"/>
<add key="TMSConnectionString" value="server=tms-sse-01;User ID=xcv;Password=mumumu777;Initial Catalog=qwer12344567;"/>
<add key="LogPath" value="e:\TMS\TMS_Log\"/>
<add key="cbtPath" value="E:\C17CBT\"/>
<add key="xmlPath" value="E:\TMS_XML\"/>
<add key="TMSVersionId" value="2.0"/>
<add key="PageHeight" value="750px"/>
<add key="Telerik.ScriptManager.TelerikCdn" value="Disabled"/>
<add key="Telerik.StyleSheetManager.TelerikCdn" value="Disabled"/>
</appSettings>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<validation validateIntegratedModeConfiguration="false"/>
<handlers>
<remove name="ChartImage_axd"/>
<remove name="Telerik_Web_UI_SpellCheckHandler_axd"/>
<remove name="Telerik_Web_UI_DialogHandler_aspx"/>
<remove name="Telerik_RadUploadProgressHandler_ashx"/>
<remove name="Telerik_Web_UI_WebResource_axd"/>
<add name="Telerik_Web_UI_DialogHandler_aspx" path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler" verb="*" preCondition="integratedMode"/>
<add name="Telerik_Web_UI_SpellCheckHandler_axd" path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler" verb="*" preCondition="integratedMode"/>
<add name="Telerik_Web_UI_WebResource_axd" path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" preCondition="integratedMode"/>
<add name="ChartImage_axd" path="ChartImage.axd" type="Telerik.Web.UI.ChartHttpHandler" verb="*" preCondition="integratedMode"/>
<add name="Telerik_RadUploadProgressHandler_ashx" path="Telerik.RadUploadProgressHandler.ashx" type="Telerik.Web.UI.RadUploadProgressHandler" verb="*" preCondition="integratedMode"/>
</handlers>
</system.webServer>
<system.web>
<customErrors mode="Off"/>
<httpHandlers>
<add path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler" verb="*" validate="false"/>
<add path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler" verb="*" validate="false"/>
<add path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" validate="false"/>
<add path="ChartImage.axd" type="Telerik.Web.UI.ChartHttpHandler" verb="*" validate="false"/>
<add path="Telerik.RadUploadProgressHandler.ashx" type="Telerik.Web.UI.RadUploadProgressHandler" verb="*" validate="false"/>
</httpHandlers>
<compilation debug="true" targetFramework="4.5">
<assemblies>
<add assembly="Microsoft.VisualC, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
<add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</assemblies>
</compilation>
<httpRuntime targetFramework="4.5"/>
<authentication mode="Windows"/>
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
<controls>
<add tagPrefix="ajaxToolkit" assembly="AjaxControlToolkit" namespace="AjaxControlToolkit"/>
<add tagPrefix="telerik" namespace="Telerik.Web.UI" assembly="Telerik.Web.UI"/>
<add tagPrefix="TMSWeb" tagName="PersonList" src="~/TMS/Controls/PersonList.ascx"/>
<add tagPrefix="TMSWeb" tagName="DateTemplate" src="~/TMS/Controls/DateTemplate.ascx"/>
</controls>
</pages>
</system.web>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.1.0.4" newVersion="2.1.0.4"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
我注意到,如果我将WebMethod参数更改为字符串并传入字符串而不是对象,则可以正常工作。因此,对象或我将其传递给WebMethod的方式似乎有问题。
在我进行AJAX调用之前,我在控制台中检查了对象,我认为它看起来没问题。虽然,我对这一切都不是很了解。
我希望我没有遗漏任何太重要的东西。如果需要更多信息,请告诉我。
提前致谢!
答案 0 :(得分:2)
根据您发布的屏幕截图判断,您将传递给$.ajax
复杂的结构。 $.ajax
将尝试将此结构序列化为JSON,这就是事情将开始失败的地方。 如果您尝试传递包含循环引用的结构,则会得到$.ajax
将生成的错误。例如,这会导致Uncaught RangeError: Maximum call stack size exceeded
错误:< / p>
var a = {};
a.foo = a;
$.ajax("/", { data: a, dataType: "json"});
我不熟悉Telerik,但get_selectedItems
的文档提到它返回GridDataItem
个对象。 These objects有一个get_owner()
方法,可以返回包含GridTableView
个对象的GridDataItem
,GridTableView
依次提供获取GridDataItem
的方法它包含的对象。那是一个循环引用。
您应该检查所选项目的数组,提取对您的应用程序有意义的标识符,并将 this 传递给您的ajax调用。
另外,你写道:
当我运行代码时,我的AJAX成功触发
不完全。您已将success
回调设置为:success: alert('Complete')
。但是,这是不正确的。您应该像这样设置:success: function () { alert('Complete') }
。您必须将函数作为success
回调传递。你拥有它的方式,alert
在 $.ajax
开始执行Ajax查询之前被称为,而作为成功处理程序传递的是{{1}的返回值},这是alert('Complete')
。