Search code examples
asp.netajaxjsonasmxwebmethod

How to format JSON for asp.net webmethod that takes class parameter


I have the following webmethod on my asp.net code behind page:

[WebMethod(EnableSession = true)]
public static bool SaveFailureData(SimpleFailureData data)
{

}

SimpleFailureData is defined as the following:

public class SimpleFailureData
{
    public int Id { get; set; }
    public string Comments { get; set; }
    public double Score { get; set; }
    public double Adjustment { get; set; }
    public List<ShutdownData> ShutdownData { get; set; }
}

public class ShutdownData
{
    public int Id { get; set; }
    public string Description { get; set; }
    public bool CausedShutdown { get; set; }
    public string ShutdownType { get; set; }
}

What I am trying to figure out is how to call this webmethod and format my data so that it is projected/parsed into that class correctly so I can use it. I tried sending a json string to the method, but my breakpoint inside the method was never hit (so I assume the method failed to call due to improper data format).

This is the JSON I tried sending and then calling the method:

json = JSON.stringify( {
    Comments: comments,
    Score: score,
    Adjustment: seAdjustmentValue,
    ShutdownData: breakdowns //this is an array of shutdown objects
});

PageMethods.SaveFailureData(json, function(data) {
    return;
});

But this failed to get inside my method. Any tips on what the JSON format should be so that is properly works for passing a class as a parameter?

Here is the JSON I attempted to send to the method:

{
"Comments":"",
"Score":66.66666666666667,
"Adjustment":0,
"ShutdownData":[{"Id":"401","CausedShutdown":true,"ShutdownType":"NORMAL"}]
}

Solution

  • ok try this

        public static bool SaveFailureData(string sampleFailure)
        {
            JavaScriptSerializer s = new JavaScriptSerializer();
            SimpleFailureData sdata = s.Deserialize<SimpleFailureData>(sampleFailure);
            return true;
        }
    
        var json = {
                    "Comments": "",
                    "Score": 66.66666666666667,
                    "Adjustment": 0,
                    "ShutdownData": [{ "Id": "401", "CausedShutdown": true, "ShutdownType": "NORMAL"}]
                }
    
                var data = JSON.stringify(json);
    
                $.ajax({
                    type: "POST",
                    url: 'Default.aspx/SaveFailureData',
                    contentType: 'application/json; charset=utf-8',
                    data: "{'sampleFailure' : '" + data + "'}",
                   // data: data,
                    dataType: 'json',
                    success: function (msg) {
                        alert(msg.d);
                    },
                    error: function (msg) {
                        alert('Error!');
                    }
                });
    
            });
    

    you will get the data in sdata object.