【问题标题】:Send a JS Array = {} to C# (WebMethod)将 JS Array = {} 发送到 C# (WebMethod)
【发布时间】:2011-09-18 05:09:34
【问题描述】:

实际上我在 JS 端声明了一个数组,如下所示:

 var benefArray = {};
 var benefCount = 0;
 var benefNome = $('#txtBenefNome').val();
 var benefDataNasc = $('#txtBenefDataNasc').val();
 var benefGrauParent = $('#txtBenefGrauParent').val();

 benefCount++;
 benefArray[benefCount] = new Array(benefNome, benefDataNasc, benefGrauParent);

              //Ajax Sender
            function sendAjax(url, parametros, sucesso) {
                $.ajax({
                    type: "POST",
                    url: url,
                    data: parametros,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: sucesso
                });
            };

 sendAjax("Client.aspx/AddClient", "{benefArray: \"" + benefArray + "\"}",
 function (msg) {
                    var retorno = msg.d;
                    alert(retorno);
                });

在我的 C# WebMethod 方面我有:

    [WebMethod]
    public static string AddClient(object benefArray)
    {
        var t = benefArray;
    }

我正在尝试从 Javascript 中获取这些值,我需要做什么? 对此的任何见解将不胜感激!谢谢

【问题讨论】:

  • benefArray 不是数组。它是一个对象。您分配给它的每个成员 (benefArray[benefCount] = new Array(benefNome, benefDataNasc, benefGrauParent);) 都是一个数组。诚然,在 JavaScript 中,JavaScript arrays aren't really arrays 的区别有点微妙,但是序列化程序在做出序列化决策时会倾向于查看类型以查看它是否是数组,因此这种区别可能会对您正在做的事情产生影响......

标签: c# javascript asp.net json


【解决方案1】:

首先定义一个模型来表示您正在使用的数据,以便您使用强类型并摆脱 object 丑陋的 AddClient 方法:

public class Benef
{
    public string Nome { get; set; }
    public string DataNasc { get; set; }
    public string GrauParent { get; set; }
}

然后让你的 web 方法获取这个模型的数组:

[WebMethod]
public static string AddClient(Benef[] benefs)
{
    // TODO: process ...

    // by the way as a result you could also return a strongly 
    // typed model and not only strings 
    // which could be easily manipulated on the client side
    return "some result"; 
}

在客户端上,您将定义一个参数数组:

var parameters = { 
    benefs: [
        {
            Nome: $('#txtBenefNome').val(),
            DataNasc: $('#txtBenefDataNasc').val(),
            GrauParent: $('#txtBenefGrauParent').val()
        }
    ]
};

$.ajax({
    type: 'POST',
    url: 'Client.aspx/AddClient',
    data: JSON.stringify(parameters),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function(result) {
        alert(result.d);
    }
});

就我在这里使用的JSON.stringify 方法而言,它在现代浏览器中是本机的。但如果您打算支持旧版浏览器,建议您在页面中包含 json2.js 脚本。

【讨论】:

  • 感谢达林的解决方法!我会尝试这样做并给你反馈。
  • @FelipeKM,您当然可以,在客户端只需执行以下操作:var parameters = { benefs: [ { ... }, { ... }, { ... } ] };,您显然可以将 ... 替换为每个好处的详细信息。
  • @FelipeKM,我明白你的意思。您可以push 向数组中添加新元素:parameters.benefs.push({ Nome: 'foo', DataNasc: 'bar', GrauParent: 'baz' });
  • @FelipeKM,.push 方法允许您将元素添加到现有数组。
  • 感谢您提供完整的答案,其中包含流程所有部分的完整代码示例。我看过很多帖子,其中一个或另一个过程的一部分只是刷过而没有解释。
【解决方案2】:

如果你想避免设置类,你也可以这样做

[WebMethod]
public static string AddClient(Hashtable[] benefs)
{       
    var n = benefs["Nome"].ToString();
    return "some result"; 
}

其他类型需要 .ToString() 然后 Parse()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2012-02-24
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2015-08-18
    相关资源
    最近更新 更多