错误:"最大调用堆栈大小超过" AJAX调用WebMethod

时间:2016-06-21 19:14:34

标签: javascript c# asp.net ajax telerik-grid

我尝试发送从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调用之前,我在控制台中检查了对象,我认为它看起来没问题。虽然,我对这一切都不是很了解。

enter image description here

我希望我没有遗漏任何太重要的东西。如果需要更多信息,请告诉我。

提前致谢!

1 个答案:

答案 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个对象的GridDataItemGridTableView依次提供获取GridDataItem的方法它包含的对象。那是一个循环引用。

您应该检查所选项目的数组,提取对您的应用程序有意义的标识符,并将 this 传递给您的ajax调用。

另外,你写道:

  

当我运行代码时,我的AJAX成功触发

不完全。您已将success回调设置为:success: alert('Complete')。但是,这是不正确的。您应该像这样设置:success: function () { alert('Complete') }。您必须将函数作为success回调传递。你拥有它的方式,alert$.ajax开始执行Ajax查询之前被称为,而作为成功处理程序传递的是{{1}的返回值},这是alert('Complete')