【问题标题】:How to format JSON for asp.net webmethod that takes class parameter如何为采用类参数的 asp.net webmethod 格式化 JSON
【发布时间】:2014-01-28 04:23:49
【问题描述】:

我的 asp.net 代码背后的页面上有以下 webmethod:

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

}

SimpleFailureData 定义如下:

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; }
}

我想弄清楚的是如何调用这个网络方法并格式化我的数据,以便正确地将其投影/解析到该类中,以便我可以使用它。我尝试向该方法发送一个 json 字符串,但我的方法内部的断点从未被命中(因此我假设该方法由于数据格式不正确而无法调用)。

这是我尝试发送然后调用方法的 JSON:

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

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

但这未能进入我的方法。关于 JSON 格式的任何提示,以便正确地将类作为参数传递?

这是我尝试发送给方法的 JSON:

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

【问题讨论】:

  • 能否请您发布确切的 json 示例..AFAIK..您必须在字符串变量中捕获您的 webmethod 中的数据,然后使用 .Net 中的 JavaScriptDeserializer 类将字符串大小写到类
  • @Arpit 我在我的问题中添加了一个示例。

标签: asp.net ajax json asmx webmethod


【解决方案1】:

按照以下步骤,您将获得所需的输出

Ajax 函数调用

function CallAjaxRequest() { 
    var Simplefailuredata = {};
    Simplefailuredata.Id = 1;
    Simplefailuredata.Comments = 'Comments-1';
    Simplefailuredata.Score = 500.25;
    Simplefailuredata.Adjustment = 700.25;
    Simplefailuredata.ShutdownData = new Array();
    Simplefailuredata.ShutdownData[0] = new Object({ Id: 2, Description: "Desc-1",  CausedShutdown: true, ShutdownType: "ShutdownType-1" });
    Simplefailuredata.ShutdownData[1] = new Object({ Id: 5, Description: "Desc-2", CausedShutdown: false, ShutdownType: "ShutdownType-2" });
    var object = JSON.stringify({ simplefailuredata: Simplefailuredata });
    $.ajax({
        type: "POST",
        url: "Default2.aspx/GetResponse",
        contentType: 'application/json; charset=utf-8',
        data: object,
        dataType: 'json',
        cache: false
    });
}


<form id="form1" runat="server">
 <div>
 <input type="button" id="btn"  value ="t" onclick="CallAjaxRequest();"   />
 </div>
</form>

代码隐藏

public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
[System.Web.Services.WebMethod]
public static string GetResponse(simplefailuredata simplefailuredata)
{
    return "";
}
}



public class simplefailuredata 
{ 
public int Id; 
public string Comments; 
public double Score; 
public double Adjustment; 
public List<shutdownData> ShutdownData; 
} 

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

【讨论】:

    【解决方案2】:

    好的,试试这个

        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!');
                    }
                });
    
            });
    

    您将获得 sdata 对象中的数据。

    【讨论】:

    • 谢谢,成功了。我确实最终使用了PageMethods.SaveFailureData 方式,但它仍然有效。
    • 这是一个智能解决方案
    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 2012-01-30
    • 2018-04-26
    • 2014-02-21
    相关资源
    最近更新 更多