【问题标题】:Passing array of int to webservice将 int 数组传递给 web 服务
【发布时间】:2011-09-11 14:48:24
【问题描述】:

我有一个对 .NET Web 服务的 $.ajax 调用,该服务又将 DAL 中的一个函数利用到实体框架。我认为这会起作用,但问题在于传递艺术家 ID 数组。我已经尝试过从字符串数组到 int 数组的各种疯狂转换,我使用过 Linq .Select,但都不起作用。我总是得到Cannot convert object of type System.String to type System.Int32[] 或类似的。我明白这个错误,我只是不知道如何解决它。

这是我的 jQuery:

                var params = new Array();
                $('ul li img.selected').each(function (index) {
                    params.push($(this).attr('id'));
                });

                var d = $('#calendar').fullCalendar('getDate').format();

                var parameters = {
                    sessionHash: 'xxx',
                    start: d,
                    end: d,
                    artists: JSON.stringify(params)
                };

                $.ajax({
                    type: "POST",
                    url: "/ws.asmx/GetDatesForArrayOfArtists",
                    data: JSON.stringify(parameters),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: (function Success(data, status) {
                        alert('hazzah!');
                    }),
                    error: (function Error(request, status, error) {
                        alert('poo botty bum smells');
                    })
                });

这是我的网络服务:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<Calendar> GetDatesForArrayOfArtists(string sessionHash, DateTime start, DateTime end, int[] artists)
        {
            var u = UserObject.GetCurrentUser(sessionHash);

            //var ints = artists.Select(x => int.Parse(x.ToString())).ToArray();

            return CalendarObject.GetDates(u.ClientId, start, end, artists);
        }

我已将一些已注释掉的代码留在其中,以便人们可以看到我修复此问题的蹩脚尝试。所以,基本问题是,鉴于上面的代码,我如何将整数数组传递给 Web 服务?

编辑1:这是浏览器控制台的两张截图,这可能有助于解释问题:

【问题讨论】:

    标签: c# jquery web-services asmx


    【解决方案1】:

    在您的跟踪中,artists 是字符串数组的数组 - [["4","5"]]。我认为应该是[4,5] 工作。

    考虑更改将 parseInt 添加到 params.push($(this).attr('id')); 并删除 JSON.stringify

    【讨论】:

    • 谢谢。完成此操作后,我现在从 Web 服务收到 Type System.String is not supported for deserialization of an array." 错误。这是因为我现在试图反序列化一个整数数组而不是字符串吗?...嗯.... 调查海狸
    • 我将 web 服务上的参数更改为 int[] artists 以接受整数 - 现在看起来像这样 [[3,4,5,6]] 并从 web 服务获得 "Type System.Int32 is not supported for deserialization of an array."。我感觉我在兜兜转转!
    • 好的,我让它工作了!耶!您的回答让我朝着正确的方向前进,整数需要解析,我需要从$.ajax 调用中的参数中删除方括号,如下所示:artists: params。最后简单得可笑。非常感谢大家:)
    【解决方案2】:

    如果不知道您遇到的问题的行号等,也许这可能会有所帮助:

    如果不能,请更新您的问题,准确说明您的代码失败的位置(哪一行和/或方法)。

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public List<Calendar> GetDatesForArrayOfArtists(string sessionHash, 
                              DateTime start, 
                              DateTime end, 
                              string[] artists)
        {
            var u = UserObject.GetCurrentUser(sessionHash);
    
            return CalendarObject.GetDates(u.ClientId, 
                       start, 
                       end, 
                       artists.Select(artist => Integer.Parse(artist)).ToArray());
        }
    

    【讨论】:

    • 注意到客户端严重缺乏错误检查和信任(糟糕!)
    • 感谢 Spence ;) 不幸的是,这并没有解决错误。我已按要求对问题进行了更详细的编辑。感谢您到目前为止的帮助;)
    【解决方案3】:

    一个简单的方法是:

    在javascript中构建一个新数组:

    var myArray = new Array();
    myArray.push([value1, value2, ...]);
    

    在 C# 中,只需创建一个 ICollection 参数即可获取您的矩阵:

    [WebMethod(EnableSession = true)]
    public void MyMethod GetMatrixFromJavascript(System.Collections.ICollection myArray) { 
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多