Передача списка целых в WebMethod с использованием jQuery и ajax - PullRequest
2 голосов
/ 24 декабря 2010

Я работаю над веб-страницей (ASP.NET 4.0), и я просто начинаю, пытаясь заставить этот ajax-вызов работать (я начинающий ajax / jQuery), и я получаю сообщение об ошибке на вызове,Вот js:

    var TestParams = new Object;
    TestParams.Items = new Object;
    TestParams.Items[0] = 1;
    TestParams.Items[1] = 5;
    TestParams.Items[2] = 10;

var finalObj = JSON.stringify(TestParams);

var _url = 'AdvancedSearch.aspx/TestMethod';

$(document).ready(function ()
{
    $.ajax({
        type: "POST",
        url: _url,
        data: finalObj,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg)
        {
            $(".main").html(msg.d);
        },
        error: function (xhr, ajaxOptions, thrownError)
        {
            alert(thrownError.toString());
        }
    });

Вот метод в моем коде файла:

[Serializable]
public class TestParams
{
    public List<int> Items { get; set; }
}

public partial class Search : Page
{
    [WebMethod]
    public static string TestMethod(TestParams testParams)
    {
        // I never hit a breakpoint in here
        // do some stuff
        // return some stuff
        return "";
    }
}

Вот строковый json, который я отправляю обратно:

{"Items":{"0":1,"1":5,"2":10}}

Когда я запускаю его, я получаю эту ошибку:

Ошибка времени выполнения Microsoft JScript: 'undefined' равен нулю или не является объектом

Это прерывает функцию ошибки.

Я также пробовал этот вариант построения json (на основе примера на веб-сайте) с этим окончательным json:

    var TestParams = new Object;
    TestParams.Positions = new Object;
    TestParams.Positions[0] = 1;
    TestParams.Positions[1] = 5;
    TestParams.Positions[2] = 10;

    var DTO = new Object;
    DTO.positions = TestParams;

    var finalObj = JSON.stringify(DTO)

{"positions":{"Positions":{"0":1,"1":5,"2":10}}}

То же сообщение об ошибке.

Itне похоже, что будет трудно отправить список целых с веб-страницы на мой веб-метод.Есть идеи?

Спасибо, Джей

Ответы [ 4 ]

4 голосов
/ 24 декабря 2010

Я попробовал это, и он работает в .NET 3.5. Разница в том, что после сериализации массив выглядит так: Items: [1,2] В .aspx

var _url = 'Default.aspx/TestMethod';
            $(document).ready(
                function() {
                    $.ajax(
                    {
                        type: "POST",
                        url: _url,
                        data: '{"i":{"Items":[1,2]} }',
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function(msg) {
                            $(".main").html(msg.d);
                        },
                        error: function(xhr, ajaxOptions, thrownError) {
                            debugger;
                            alert(thrownError.toString());
                        }
                    }
                    )
                }
                );

In .cs

[WebMethod]     
    public static string TestMethod(TestParams i)     
    {


        return "whaever";     
    } 

Я получил строку из этого

var serializer = new JavaScriptSerializer();

        var param = new TestParams();
        var list = new List<int> {1, 2};

        param.Items = list;

        string serializedString = serializer.Serialize(param);

Надеюсь, это поможет.

3 голосов
/ 17 октября 2012

Изменить 'TestParams.Items = new Object ();' до

TestParams.Items = new Array();
1 голос
/ 24 декабря 2010

Возможно, в вашем классе codebehind отсутствует атрибут scriptservice , чтобы сделать веб-метод доступным из скрипта.Посмотреть это http://msdn.microsoft.com/en-us/library/system.web.script.services.scriptserviceattribute.aspx.

0 голосов
/ 24 декабря 2010

Я могу ошибаться, но похоже, что вы должны попробовать это:

[Serializable]
public class TestParams
{
    public List<int> Items { get; set; }
}

public partial class Search : Page
{
    [WebMethod]
    public static string TestMethod(List<int> finalObj)
    {
        TestParams testParams = new TestParams { Items = finalObj };

        //Use whatever method you have to return the testParams as JSON 
        return testParams;
    }
}

При обратном вызове вам нужно будет получить данные. Элементы:

success: function (msg)
  {
      $(".main").html(msg.Items);
  },

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...