Какова правильная подпись для веб-метода, который обрабатывает этот запрос jquery ajax? - PullRequest
0 голосов
/ 16 сентября 2011

Какая подпись требуется для моего веб-метода, чтобы я мог передать 'paramlist' в качестве параметра?

<script type="text/javascript">
    $(document).ready(function () {
        var slider = $('.slider').slider({
            range: "min",
            min: 0,
            max: 100,
            change: function (e, ui) {
                var set = new Array();

                var values = $('.slider').each(function () {
                    var s = $(this);
                    var data = {
                        Name: s.attr('itemName'),
                        SelectedIndex: s.slider("option","value"),
                        Description: "this is the description",
                        CalculatedValue: 0
                    }

                    set.push(data);    
                });

                CallPageMethod("SliderChanged", set, successful, failure);
            },
            slide: function (e, ui) {
                var point = ui.value;
                $("#selected_value").html(point);
                // var width = 100 - point;
                // $("#range").css({ "width": point + "%" });
            }
        });

        function CallPageMethod(methodName, paramArray, onSuccess, onFail) {
            //get the current location
            var loc = window.location.href;
            loc = (loc.substr(loc.length - 1, 1) == "/") ? loc + "default.aspx" : loc;

            //call the page method
            $.ajax({
                type: "POST",
                url: loc + "/" + methodName,
                data:  JSON.stringify(paramArray),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: onSuccess,
                fail: onFail
            });
        }

        function successful(response) {
            var lbl = $('#<%= Label1.ClientID %>')
            lbl.html("Your report is now ready for download.");
            alert(response.d);
        }

        function failure(response) {
            alert("An error occurred.");
        }
    });
</script> 

Я пробовал:

[WebMethod]
public static string SliderChanged(MyModel[] values)
{
    return "success";
}

, где

public class MyModel
{
   public string Name {get;set;}
   public string Description {get;set;}
   public int SelectedIndex{get;set;}
   public int CalculatedValue(get;set;}
}

и это не удается.

Можете ли вы определить мою ошибку?

1 Ответ

2 голосов
/ 16 сентября 2011

Хорошо, давайте упростим, потому что эти объединения строк просто безобразны.Это очень легко сделать, если вы реплицируете ту же структуру на сервере.

Итак, давайте предположим, что вы хотите отправить на сервер следующий объект javascript:

var myObject = { a: { one: 1, two: 2 }, b: [1, 2, 3] };

Вы должны определитьклассы, которые соответствуют этой подписи:

public class MyModel
{
    public Foo A { get; set; }
    public int[] B { get; set; }
}

public class Foo
{
    public int One { get; set; }
    public int Two { get; set; }
}

и имеют веб-метод:

[WebMethod]
public string SomeMethod(MyModel model)
{
    ...
}

, который вы будете вызывать так:

var myObject = { a: { one: 1, two: 2 }, b: [1, 2, 3] };
$.ajax({
    url: '/SomeService.asmx/SomeMethod',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(myObject),
    success: function(result) {
        // Notice the .d property here. That's specific to ASP.NET web methods, 
        // which wrap the response using this property, like this:
        // { d: ... }
        alert(result.d);
    }
});

Обратите внимание на JSON.stringifyметод.Он преобразует объект javascript в строковое представление JSON.Этот метод изначально встроен в современные веб-браузеры, но если вам нужно поддерживать устаревшие браузеры, вы можете включить на свою страницу json2.js , которая проверит, поддерживает ли браузер метод и использует его или нет.• предоставить альтернативную реализацию.

Другой пример, если, если вы хотите отправить массив объектов, например:

var myObject = [
    { a: { one: 1, two: 2 }, b: [1, 2, 3] },
    { a: { one: 5, two: 9 }, b: [7, 3, 4] },
    { a: { one: 3, two: 0 }, b: [3, 9, 3] },
]

, тогда ваш веб-метод будет просто выглядеть так:

[WebMethod]
public string SomeMethod(MyModel[] model)
{
    ...
}

Вооружившись этими знаниями, вы можете очень легко обмениваться структурами данных между javascript и вашими веб-методами.

...