Sys.ArgumentException: Cannot deserialize. The data does not correspond to valid JSON

I'm having trouble with one of my user controls when it is placed in an UpdatePanel. The control is a database bound GridView with a custom filter area above it. In the filter area, the user can select a column to filter on and enter the value to look for. There is a filter pushbutton to actually perform the filtering and refresh the gridview.

The user control works well when the column to filter on is a numeric or boolean column. But when the column is of type text or date, then an error occurs when the filter button is used.

The error is: "Microsoft JScript runtime error: Sys.ArgumentException: Cannot deserialize. The data does not correspond to valid JSON. Parameter name: data"

Apart of the control being in an UpdatePanel, I'm not doing anything client-side here, and I don't understand where this JSON error is coming from or how to solve this.

The error only occurs when the user control is in an UpdatePanel. When I take it out of any update panel, the error disappears and the gridview is filtered correctly.
But I need to be able to use this control within update panels, so I need to get this fixed.

Can anyone here help? Thanks in advance.
LVL 1
MarjaRAsked:
Who is Participating?
 
MarjaRConnect With a Mentor Author Commented:
I found the cause of the JSON error when using an UpdatePanel.  
My user control has a sub named 'AddHistoryPoint' to add history points to the ScriptManager (see code snippet below).

When the Filter-button in the user control is clicked, a SQL WHERE clause is built and fed to the GridView to return only the records that comply to the search filter. That WHERE clause is saved in a property on the user control. And as part of the Set branch of that property, the AddHistoryPoint sub was called (see code snippet below).

It turns out that the problem lies in the AddHistoryPoint sub:
Single quotes in the SQL WHERE clause around string and date values cause this JSON problem with the UpdatePanel.
Once I remove the AddHistoryPoint call in the Filter property the JSON error vanishes.
Now I need to decide whether I can do without the AddHistoryPoint call, but at least I now know what the cause of the JSON error is.

Protected Sub AddHistoryPoint(ByVal p_sKey As String, ByVal p_sValue As String)
        Dim l_oSM As ScriptManager = ScriptManager.GetCurrent(Me.Page)
        If l_oSM IsNot Nothing AndAlso l_oSM.EnableHistory AndAlso l_oSM.IsInAsyncPostBack AndAlso Not l_oSM.IsNavigating Then
            l_oSM.AddHistoryPoint(p_sKey.ToString, p_sValue.ToString)
        End If
    End Sub

    Public Property Filter() As String
        Get
            Return wsCustomGridView.Filter
        End Get
        Set(ByVal value As String)
            wsCustomGridView.Filter = value
            AddHistoryPoint(_sCurrentURL & "_wsCompositeGridViewFilter_", value.ToString)
        End Set
    End Property

Open in new window

0
 
Albert Van HalenAnalyst developerCommented:
The JSON is generated server side and parsed client side.
Probably an issue server side. Attach to your worker process in visual studio to debug server side and see what is going on, or attach client side to your process where JSON is retrieved.
0
 
leakim971PluritechnicianCommented:
Hello MarjaR,

As you said you only have problem with string.
String can contain special/reserved characters like double quote or reverse solidus (backslash).
How do you encode you string or your json string before send it ?

You've classes to do this job :
http://www.webdevbros.net/2007/04/26/generate-json-from-asp-datatypes/
http://code.google.com/p/aspjson/
http://tforster.wik.is/ASP_Classic_Practices_For_The_21st_Century/JSON4ASP

All found here : http://json.org/
(see the appropriate language at bottom of the page)

Regards.
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
MarjaRAuthor Commented:
I'm not actively using JSON (in fact, I didn't know what that is until I started getting this error).

How would I attach client side to your process where JSON is retrieved?
0
 
Albert Van HalenAnalyst developerCommented:
Well, if you're using IE or FF (in combination with FireBug) simply put a debugger statement where JSON is parsed clientside.
Beware however that script debugging must be enabled in IE.
0
 
leakim971PluritechnicianCommented:
0
 
MarjaRAuthor Commented:
But I am not actively parsing any JSON and I don't know where to hook up a debugger to it.
This is simply a server-side ASP.NET user control in an UpdatePanel,

So where does JSON come into the picture?
0
 
leakim971PluritechnicianCommented:
>I am not actively
Seems it's done passively...

Could you put you code here ? Page and code behind ?
0
 
MarjaRAuthor Commented:
Code of the test page:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="test.aspx.vb" Inherits="WebwareNET.test" %>

<%@ Register Src="~/wsUserControls/wsCompositeGridView.ascx" TagName="wsCompositeGridView"
    TagPrefix="uc1" %>
<%@ Register Src="~/wsUserControls/wsLoading.ascx" TagName="wsLoading" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>

    <script language="javascript" type="text/javascript" src="wsAdmin/js/wsGeneral.js"></script>

    <script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>

    <script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>

    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/cupertino/jquery-ui.css"
        type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true"
        EnableScriptGlobalization="true" EnableScriptLocalization="true" EnableHistory="true"
        EnableSecureHistoryState="false" />
    <div>
        <asp:Literal ID="Literal1" runat="server"></asp:Literal>
        <asp:UpdatePanel ID="upMainContent" UpdateMode="Conditional" ChildrenAsTriggers="true"
            runat="server">
            <ContentTemplate>
                <uc1:wsCompositeGridView ID="cgvConfig" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdateProgress ID="upMainContentProgress" runat="server" AssociatedUpdatePanelID="upMainContent"
            DisplayAfter="500">
            <ProgressTemplate>
                <uc1:wsLoading ID="upLoading" runat="server" />
            </ProgressTemplate>
        </asp:UpdateProgress>
    </div>
    </form>
</body>
</html>

And its code behind:

Imports WebwareNET.wsCore

Public Partial Class test
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then
            cgvConfig.PrimaryTable = "Config"
            cgvConfig.DisplayColumns = "txtVarName,txtVarValue,memVarDesc"
            cgvConfig.SortDirection = SortDirection.Ascending
            cgvConfig.SortExpression = "txtVarName"
            cgvConfig.AllowFilter = True
            cgvConfig.AllowExport = True
            cgvConfig.AllowView = True
            cgvConfig.AllowUpdate = True

            ' always working with predefined set, so prevent adding, duplicating and deleting
            cgvConfig.AllowAdd = False
            cgvConfig.AllowDuplicate = False
            cgvConfig.AllowDelete = False

            cgvConfig.AllowColumnDisplayChoice = True
            cgvConfig.MaintenanceURL = "~/wsAdmin/db_config_edit.aspx?id="
        End If

    End Sub

#Region "Event handling"

    ''' <summary>
    ''' Handles the AsyncPostBackError event of the ScriptManager1 control.
    ''' </summary>
    ''' <param name="sender">The source of the event.</param>
    ''' <param name="e">The <see cref="System.Web.UI.AsyncPostBackErrorEventArgs" /> instance containing the event data.</param>
    Protected Sub ScriptManager1_AsyncPostBackError(ByVal sender As Object, ByVal e As System.Web.UI.AsyncPostBackErrorEventArgs)
        If (e.Exception.Data("ExtraInfo") IsNot Nothing) Then
            ScriptManager1.AsyncPostBackErrorMessage = _
               e.Exception.Message & _
               e.Exception.Data("ExtraInfo").ToString()
        Else
            ScriptManager1.AsyncPostBackErrorMessage = _
               "An unspecified error occurred."
        End If
        Dim l_oErrorHandler As New wsErrorHandler
        l_oErrorHandler.LogError(e.Exception)
        l_oErrorHandler.DisplayErrorPage()
    End Sub

#End Region

End Class

The user control:

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="wsCompositeGridView.ascx.vb"
    Strict="true" Inherits="WebwareNET.wsUserControls.wsCompositeGridView" %>
<%@ Register Src="wsDatePicker.ascx" TagName="wsDatePicker" TagPrefix="uc1" %>
<%@ Register Src="wsColumnPickerDialog.ascx" TagName="wsColumnPickerDialog" TagPrefix="uc2" %>
<asp:Panel ID="pnActions" runat="server" Visible="false">
    <fieldset id="fldActions" runat="server">
        <legend id="lgdActions" runat="server" enableviewstate="false">
            <asp:Label ID="Label1" runat="server" EnableViewState="false" Text="<%$ Resources:wsGeneral, langActions %>"></asp:Label>
        </legend>
        <asp:Panel ID="divActions" runat="server">
            <table class="tblDataEntry" cellpadding="0" cellspacing="0" width="100%">
                <tr id="trMultiSelectActions" valign="baseline" runat="server">
                    <th align="right" width="25%" style="white-space: nowrap;">
                        <asp:Label ID="lblbActionTarget" AssociatedControlID="rdActionTarget" runat="server"
                            EnableViewState="false" Text="<%$ Resources:wsGeneral, langActionTarget %>"></asp:Label>:
                    </th>
                    <td align="left">
                        <asp:RadioButtonList ID="rdActionTarget" runat="server" EnableViewState="true">
                            <asp:ListItem Value="s" Selected="True" Text="<%$ Resources:wsGeneral, langActionTargetSelection %>"></asp:ListItem>
                            <asp:ListItem Value="a" Text="<%$ Resources:wsGeneral, langActionTargetAll %>"></asp:ListItem>
                        </asp:RadioButtonList>
                    </td>
                </tr>
                <tr valign="baseline">
                    <td colspan="2">
                        <asp:PlaceHolder ID="phActionCommands" runat="server" EnableViewState="true"></asp:PlaceHolder>
                        <asp:PlaceHolder ID="phActionPanel" EnableViewState="true" runat="server"></asp:PlaceHolder>
                        <asp:Panel ID="pnSelectedIDs" Visible="false" runat="server">
                            <asp:Literal ID="Literal2" runat="server" EnableViewState="false" Text="<hr>Geselecteerde IDs: "></asp:Literal>
                            <asp:Label ID="Label3" runat="server" EnableViewState="false" Text="n.v.t."></asp:Label>
                        </asp:Panel>
                    </td>
                </tr>
            </table>
        </asp:Panel>
    </fieldset>
</asp:Panel>
<asp:Panel ID="pnFilter" DefaultButton="btnFilter" runat="server">
    <fieldset id="fldFilter" runat="server">
        <legend id="lgdFilter" runat="server">
            <asp:Label ID="lblFilterLabel" runat="server" EnableViewState="false" Text="<%$ Resources:wsGeneral, langActionSearch %>"></asp:Label>
        </legend>
        <div id="divFilterCriteria" style="display: inline; white-space: nowrap;" runat="server">
            <strong>
                <asp:Label ID="lblFilter" runat="server" EnableViewState="false" Text="<%$ Resources:wsGeneral, langSearchFilter %>"></asp:Label>
                :</strong>
            <asp:DropDownList ID="ddlFields" AutoPostBack="false" runat="server">
            </asp:DropDownList>
            <asp:DropDownList ID="ddlCompareText" runat="server" AutoPostBack="false">
                <asp:ListItem Value="Like" Text="<%$ Resources:wsGeneral, langSearchLike %>"></asp:ListItem>
                <asp:ListItem Value="StartsWith" Text="<%$ Resources:wsGeneral, langSearchStartsWith %>"></asp:ListItem>
                <asp:ListItem Value="EndsWith" Text="<%$ Resources:wsGeneral, langSearchEndsWith %>"></asp:ListItem>
                <asp:ListItem Value="Equals" Text="<%$ Resources:wsGeneral, langSearchEquals %>"></asp:ListItem>
                <asp:ListItem Value="Unequal" Text="<%$ Resources:wsGeneral, langSearchUnequal %>"></asp:ListItem>
                <asp:ListItem Value="GreaterThan" Text="<%$ Resources:wsGeneral, langSearchGreaterThan %>"></asp:ListItem>
                <asp:ListItem Value="LowerThan" Text="<%$ Resources:wsGeneral, langSearchLowerThan %>"></asp:ListItem>
                <asp:ListItem Value="GreaterThanOrEquals" Text="<%$ Resources:wsGeneral, langSearchEqualsOrGreaterThan %>"></asp:ListItem>
                <asp:ListItem Value="LowerThanOrEquals" Text="<%$ Resources:wsGeneral, langSearchEqualsOrLowerThan %>"></asp:ListItem>
                <asp:ListItem Value="Empty" Text="<%$ Resources:wsGeneral, langSearchEmpty %>"></asp:ListItem>
                <asp:ListItem Value="NonEmpty" Text="<%$ Resources:wsGeneral, langSearchNonEmpty %>"></asp:ListItem>
            </asp:DropDownList>
            <asp:DropDownList ID="ddlCompareBoolean" runat="server" AutoPostBack="false">
                <asp:ListItem Value="Equals" Text="<%$ Resources:wsGeneral, langSearchEquals %>"></asp:ListItem>
            </asp:DropDownList>
            <asp:DropDownList ID="ddlCompareNumeric" runat="server" AutoPostBack="false">
                <asp:ListItem Value="Equals" Text="<%$ Resources:wsGeneral, langSearchEquals %>"></asp:ListItem>
                <asp:ListItem Value="Unequal" Text="<%$ Resources:wsGeneral, langSearchUnequal %>"></asp:ListItem>
                <asp:ListItem Value="GreaterThan" Text="<%$ Resources:wsGeneral, langSearchGreaterThan %>"></asp:ListItem>
                <asp:ListItem Value="LowerThan" Text="<%$ Resources:wsGeneral, langSearchLowerThan %>"></asp:ListItem>
                <asp:ListItem Value="GreaterThanOrEquals" Text="<%$ Resources:wsGeneral, langSearchEqualsOrGreaterThan %>"></asp:ListItem>
                <asp:ListItem Value="LowerThanOrEquals" Text="<%$ Resources:wsGeneral, langSearchEqualsOrLowerThan %>"></asp:ListItem>
            </asp:DropDownList>
            <asp:DropDownList ID="ddlCompareDate" runat="server" AutoPostBack="false">
                <asp:ListItem Value="Equals" Text="<%$ Resources:wsGeneral, langSearchEquals %>"></asp:ListItem>
                <asp:ListItem Value="Unequal" Text="<%$ Resources:wsGeneral, langSearchUnequal %>"></asp:ListItem>
                <asp:ListItem Value="GreaterThan" Text="<%$ Resources:wsGeneral, langSearchGreaterThan %>"></asp:ListItem>
                <asp:ListItem Value="LowerThan" Text="<%$ Resources:wsGeneral, langSearchLowerThan %>"></asp:ListItem>
                <asp:ListItem Value="GreaterThanOrEquals" Text="<%$ Resources:wsGeneral, langSearchEqualsOrGreaterThan %>"></asp:ListItem>
                <asp:ListItem Value="LowerThanOrEquals" Text="<%$ Resources:wsGeneral, langSearchEqualsOrLowerThan %>"></asp:ListItem>
                <asp:ListItem Value="Empty" Text="<%$ Resources:wsGeneral, langSearchEmpty %>"></asp:ListItem>
                <asp:ListItem Value="NonEmpty" Text="<%$ Resources:wsGeneral, langSearchNonEmpty %>"></asp:ListItem>
            </asp:DropDownList>
            <asp:DropDownList ID="ddlBoolean" runat="server" AutoPostBack="false">
                <asp:ListItem Value="True" Text="<%$ Resources:wsGeneral, langYes %>"></asp:ListItem>
                <asp:ListItem Value="False" Text="<%$ Resources:wsGeneral, langNo %>"></asp:ListItem>
            </asp:DropDownList>
            <asp:TextBox ID="txtField" runat="server"></asp:TextBox>
            <div id="divDatePicker" runat="server" style="display: inline;">
                <uc1:wsDatePicker ID="dateField" runat="server" />
            </div>
            &nbsp;&nbsp;
        </div>
        <span id="divPageSize" runat="server" enableviewstate="true"><strong>
            <asp:Label ID="lblPageSize" runat="server" Text="<%$ Resources:wsGeneral, langGridPageSize %>"
                EnableViewState="false"></asp:Label>
            :</strong>
            <asp:DropDownList ID="ddlPageSize" EnableViewState="true" AutoPostBack="false" runat="server">
            </asp:DropDownList>
        </span>
        <asp:Button ID="btnFilter" runat="server" EnableViewState="false" Text="<%$ Resources:wsGeneral, langActionFilter %>" />
    </fieldset>
    <br />
</asp:Panel>
<WebwareNET:wsGridView ID="wsCustomGridView" EnableViewState="true" runat="server"
    AllowPaging="True" AutoGenerateCheckBoxColumn="false" AutoGenerateRadioButtonColumn="false"
    AutoGenerateColumns="false" PageSize="20" CssClass="tblData" AlternatingRowStyle-CssClass="onAlternate"
    GridLines="None" CellSpacing="0" CellPadding="2" BorderWidth="0">
    <PagerSettings Position="TopAndBottom" />
    <PagerTemplate>
        <table width="100%" cellpadding="0" cellspacing="0" border="0">
            <tr style="border: none;">
                <td align="left">
                    <asp:Label ID="lblGridTotalRecords" runat="server" EnableViewState="false" Text="<%$ Resources:wsGeneral, langGridTotalRecords %>"></asp:Label>
                </td>
                <td align="center">
                    <asp:LinkButton ID="lnkGridFirstPage" runat="server" BorderStyle="None" OnClick="lnkGridFirstPage_Click"
                        EnableViewState="false">
                        <asp:Label ID="lblGridFirstPage" runat="server" Text="&laquo;" EnableViewState="false"></asp:Label></asp:LinkButton>
                    <asp:LinkButton ID="lnkGridPreviousPage" runat="server" BorderStyle="None" OnClick="lnkGridPreviousPage_Click"
                        EnableViewState="false">
                        <asp:Label ID="lblGridPreviousPage" runat="server" Text="<" EnableViewState="false"></asp:Label></asp:LinkButton>
                    <asp:LinkButton ID="lnkGridNextPage" runat="server" BorderStyle="None" OnClick="lnkGridNextPage_Click"
                        EnableViewState="false">
                        <asp:Label ID="lblGridNextPage" runat="server" Text=">" EnableViewState="false"></asp:Label></asp:LinkButton>
                    <asp:LinkButton ID="lnkGridLastPage" runat="server" BorderStyle="None" OnClick="lnkGridLastPage_Click"
                        EnableViewState="false">
                        <asp:Label ID="lblGridLastPage" runat="server" Text="&raquo;" EnableViewState="false"></asp:Label></asp:LinkButton>
                </td>
                <td align="right">
                    <asp:Label ID="lblGridPageCurrent" runat="server" EnableViewState="false" Text="<%$ Resources:wsGeneral, langGridPageCurrent %>"></asp:Label>
                    <asp:DropDownList ID="ddlGridPages" runat="server" OnSelectedIndexChanged="ddlGridPages_SelectedIndexChanged"
                        AutoPostBack="True">
                    </asp:DropDownList>
                    <asp:Label ID="lblGridPageOf" runat="server" EnableViewState="false" Text="<%$ Resources:wsGeneral, langGridPageOf %>"></asp:Label>
                </td>
            </tr>
        </table>
    </PagerTemplate>
    <EmptyDataTemplate>
        <asp:Label ID="lblEmptyData" runat="server" EnableViewState="false" Text="<%$ Resources:wsGeneral, langNoRecordsFound %>"></asp:Label>
    </EmptyDataTemplate>
</WebwareNET:wsGridView>
<asp:PlaceHolder ID="phColumnPicker" runat="server"></asp:PlaceHolder>

Its code behind is rather lengthy. I don't think it's feasible to post it here.

0
 
leakim971PluritechnicianCommented:
>Its code behind is rather lengthy. I don't think it's feasible to post it here.
You may attach is as file or generaly code snippet 'see below) is a good boy :

Here to post code ;-)

Open in new window

0
 
leakim971PluritechnicianCommented:
What is :
wsAdmin/js/wsGeneral.js
WebwareNET:wsGridView

http://www.dancingatorwebware.net ?
0
 
MarjaRAuthor Commented:
Our company name is Webware Systems (hence the prefix 'ws' in our file names etc.), and WebwareNET is the namespace for our products.

wsAdmin/js/wsGeneral.js is a JavaScript file with some general purpose JavaScript functions we use throughout our system.

The class WebwareNET.wsGridView is a subclass of the standard ASP.NET GridView class. We have built our own custom paging and sorting mechanism.

I'm reluctant to post the entire code behind file for our user control here, because this is a public forum and I don't want any of our competitors to view behind our "scenes".
0
 
Albert Van HalenAnalyst developerCommented:
You probably have (custom) events for filtering and sorting (assuming) via callback events.
See what is being generated in any of those events and check if it's valid JSON...
Post code if needed
0
 
MarjaRAuthor Commented:
Sorting and paging are fine, both within or outside an UpdatePanel. The JSON error only occurs when pushing the Filter button for text and date columns.

The Filter button causes a postback and the event handler for the Filter button is posted in the attached code snippet..
In that event handler a Refresh() method is triggered to fill the GridView with the new record selection, see attached code snippet.

And that's it. Nothing more is happening. So where/when does this JSON code gets generated and how can I "capture" that?
Protected Sub btnFilter_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnFilter.Click
        If Me.PageSize <> ddlPageSize.SelectedValue Then
            Me.PageIndex = 0
        End If
        Me.PageSize = ddlPageSize.SelectedValue
        BuildFilter()
        Refresh()
    End Sub

    Public Sub Refresh()

        ' fill our GridView with data
        FillCustomGridView()
        If wsCustomGridView.DataSource Is Nothing AndAlso Me.AllowFilter = True AndAlso wsUtils.IsEmpty(Me.Filter) = False Then
            ' we didn't find any records (anymore), but we still have an active search filter
            ' so empty the search filter
            Me.Filter = ""
            ' reset filter controls
            ddlFields.SelectedIndex = 0
            ddlCompareText.SelectedIndex = 0
            ddlCompareNumeric.SelectedIndex = 0
            ddlCompareDate.SelectedIndex = 0
            ddlCompareBoolean.SelectedIndex = 0
            ddlBoolean.SelectedIndex = 0
            txtField.Text = ""
            dateField.Text = ""
            ddlBoolean.SelectedIndex = 0
            ' and try filling the GridView again
            FillCustomGridView()
        End If
        '
        _bIsRefresh = True
        '
        pnFilter.Visible = False
        pnActions.Visible = False

        If wsCustomGridView.DataSource IsNot Nothing AndAlso wsCustomGridView.Rows.Count > 0 Then
            If Me.AllowFilter OrElse Me.AllowPageSize Then
                pnFilter.Visible = True
                If Me.AllowFilter Then
                    ' now we know which columns are displayed in the grid, we can fill our fields dropdown
                    FillFieldsDropDown()
                    divFilterCriteria.Visible = True
                Else
                    btnFilter.Text = wsLanguage.GetLang("langActionShow")
                    lblFilterLabel.Text = wsLanguage.GetLang("langActionShow")
                    divFilterCriteria.Visible = False
                End If
                If Me.AllowPageSize Then
                    divPageSize.Visible = True
                Else
                    divPageSize.Visible = False
                End If
            End If
        End If

        If Me.AllowCommands Then
            pnActions.Visible = True
            If Me.AutoGenerateCheckBoxColumn = True Then
                trMultiSelectActions.Visible = True
            Else
                trMultiSelectActions.Visible = False
            End If
        Else
            pnActions.Visible = False
        End If

    End Sub

Open in new window

0
 
MarjaRAuthor Commented:
I'm still having this JSON problem, and I don't know how to fix it or how to find out where this error is being generated.

Please, can anyone tell me how to hook up a debugger to JSON code generated natively by (the UpdatePanel) ASP.NET?
0
 
leakim971PluritechnicianCommented:
Why not escape the quotes ? And unescape at server side ?
Check again this thread : http://forums.asp.net/t/1138239.aspx
0
 
MarjaRAuthor Commented:
I'm not explicitly serializing anything, the UpdatePanel is doing that behind the scenes. Therefor the thread at http://forums.asp.net/t/1138239.aspx doesn't seem relevant.

But maybe I can escape the quotes in the AddHistoryPoint sub. I'll look into that.
0
All Courses

From novice to tech pro — start learning today.