C# webmethods中JSON的反序列化

C# webmethods中JSON的反序列化,c#,asp.net,ajax,json,webmethod,C#,Asp.net,Ajax,Json,Webmethod,基于以下代码 用户可以通过一个单独的功能来添加任意多的“支出”。然后我向DOM中添加一个新的'li',并自动生成txt ID <ul id="ulOutgoing"> <li> <label>Outgoing 1</label><input type="text" id="txtOutGoing0"> </li> <li> <label>

基于以下代码

用户可以通过一个单独的功能来添加任意多的“支出”。然后我向DOM中添加一个新的'li',并自动生成txt ID

<ul id="ulOutgoing">    
    <li>
        <label>Outgoing 1</label><input type="text" id="txtOutGoing0">
    </li>
    <li>
        <label>Outgoing 2</label><input type="text" id="txtOutGoing1">
    </li>
</ul>    
我的web方法需要接受JSON对象并使其可用,这样我就可以循环使用txt值和标签,并执行一些db交互和进一步的逻辑

[WebMethod]
public static string getPieData(OutGoings OutGoings)
{
    //Handel the object
}

public struct OutGoings
{

}
所以。。。我有两个问题
  • 我是否创建了正确的JSON对象以推送到我的web方法
  • 如何在webmethod中反序列化对象,以及我的“OutGoings”结构应该采用什么结构?

    您可能需要一组
    OutGoing

    public class OutGoing
    {
        public string Label { get; set; }
        public string Value { get; set; }
    }
    
    在页面方法中:

    [WebMethod]
    public static string GetPieData(OutGoing[] outGoings)
    {
        // Handle the object
    
        return "Hello World";
    }
    
    $.ajax({
        url: 'visualise-my-outgoings.aspx/GetPieData',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify({ outGoings: outGoings }),
        success: function(result) {
            // TODO : process the results
            alert(result.d);
        }
    });
    
    最后,客户端只需通过
    li
    元素循环来填充此集合:

    var outGoings = $('#ulOutgoing li').map(function() {
        return {
            Label: $('label', this).html(),
            Value: $('input', this).val()
        };    
    }).toArray();
    
    然后将其发布到页面方法:

    [WebMethod]
    public static string GetPieData(OutGoing[] outGoings)
    {
        // Handle the object
    
        return "Hello World";
    }
    
    $.ajax({
        url: 'visualise-my-outgoings.aspx/GetPieData',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify({ outGoings: outGoings }),
        success: function(result) {
            // TODO : process the results
            alert(result.d);
        }
    });
    

    JSON.stringify
    方法是将javascript数组正确序列化为JSON字符串的方法。它是本机内置的现代浏览器。如果需要支持传统浏览器,则可能需要将脚本包含到页面中。

    不要使用结构,请使用类。C#将为您处理反序列化。你想要的是:

    [WebMethod]
    public void  getPieData(OutGoings[] outGoings)
    {
        // loop over array, interact with db
    }
    
    public class OutGoings
    {
        public string Text{ get; set; }
        public string Value{ get; set; }
    }
    

    我的答案的干净版本,upvoted,可能会添加返回的字符串是result。d@Guillaume86,在您的回答中,您似乎没有使用此处所需的集合。是的,没有注意html,我删除了我的回答您可以使用map来避免之前创建数组populating@Guillaume86,非常好的建议。已更新答案以将其考虑在内。请参阅链接: