Не удается получить jQuery Ajax для анализа результатов веб-сервиса JSON - PullRequest
3 голосов
/ 06 июля 2010

Я проверил ответ JSON от моего C # Webmethod, поэтому я не верю, что это проблема.

Я пытаюсь проанализировать результат, используя простой jQuery $ .ajax, но по какой-то причине я не могу заставить метод корректно запускать и анализировать результат, а также, кажется, случайно не получается получить функцию для запуска результата. Существуют ли какие-либо ограничения на размер объекта JSON, которые могут быть возвращены.

Я также удалил этот код изнутри страницы "Site.Master", потому что он всегда обновлялся, когда я нажимал на простую кнопку. Правильно ли работают теги с такими элементами jQuery, как ввод с кнопки, который я получаю из DOM?

function ajax() {
//var myData = { qtype: "ProductName", query: "xbox" };
var myData = { "request": { qtype: "ProductName", query: "xbox"} };
$.ajax({
    type: "POST",
    url: "/webservice/WebService.asmx/updateProductsList",
    data: {InputData:$.toJSON(myData)},
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) {
        // var msg = {__type: "Testportal.outputData", id: "li1234", message: "it's work!", myInt:101}
        alert("message=" + msg.d.ProductName + ", id=" + msg.d.Brand);
    },
    error: function (res, status) {
        if (status === "error") {
            // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace
            var errorMessage = $.parseJSON(res.responseText);
            alert(errorMessage.Message);
        }
    }
});

}

А на странице:

 <asp:Button ID="Button1" runat="server" OnClientClick="ajax();"  Text="Button" /> 

И серверный веб-метод:

 public class WebService : System.Web.Services.WebService
{
    [WebMethod]
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public OutputData updateProductsList(InputData request)
    {
        OutputData result = new OutputData();
        var db = new App_Data.eCostDataContext();
        var q = from c in db.eCosts
                select c;

        if (!string.IsNullOrEmpty(request.qtype) && !string.IsNullOrEmpty(request.query))
        {
            q = q.Like(request.qtype, request.query);
        }

        //q = q.Skip((page - 1) * rp).Take(rp);
        result.products = q.ToList();

        searchObject search = new searchObject();

        foreach (App_Data.eCost product in result.products)
        {
            /* create new item list */
            searchResult elements = new searchResult()
            {
                id = product.ProductID,
                elements = GetPropertyList(product)
            };
            search.items.Add(elements);
        }
        return result;

    }

И вспомогательные классы:

    public class OutputData
{
    public string id { get; set; }
    public List<App_Data.eCost> products { get; set; }

}
public class InputData
{
    public string qtype { get; set; }
    public string query { get; set; }
}

Ответы [ 3 ]

1 голос
/ 07 июля 2010

Мне кажется, что ваша проблема в том, что вы пытаетесь использовать ручную сериализацию JSON.Есть более прямой путь.Вы должны просто объявить [ScriptMethod (ResponseFormat = ResponseFormat.Json)] или [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] и вернуть return direct объект вместо строки из веб-метода.На стороне клиента (в JavaScript) я настоятельно рекомендую вам использовать JSON.stringify (из json2.js, который можно загрузить из http://www.json.org/js.html) для построения параметра data для jQuery.ajax.

Посмотрите на Можно ли вернуть JSON из веб-службы .asmx, если ContentType не является JSON? и Как создать объект JSON для отправки в AJAX WebService? , вероятнотакже в вызов JQuery ajax к httpget webmethod (c #) не работает у вас есть интерес к дополнительным экспериментам.

1 голос
/ 08 июля 2010

Одна из проблем, с которой вы можете столкнуться, заключается в том, что вы ничего не делаете, чтобы кнопка не отправляла форму и не выполняла полную обратную передачу / перезагрузку одновременно с запуском обратного вызова $ .ajax ().

Я бы посоветовал сделать это незаметно, вместо использования свойства OnClientClick, например:

$(document).ready(function() {
  // May need to use $('<%= Button1.ClientID %>') if your Button is 
  //  inside a naming container, such as a master page.
  $('#Button1').click(function(evt) {
    // This stops the form submission.
    evt.preventDefault();

    $.ajax({
      // Your $.ajax() code here.
    });
  });
});

Я также согласен с Олегом, что вы должны использовать json2.js для строкового анализа и анализа JSON.В более новых браузерах это будет возвращаться к собственным реализациям этих методов в браузерах, что намного быстрее и делает анализ более безопасным.

Обновление:

ОтветВаш вопрос о данных, нет, выглядит не совсем правильно.

В конечном итоге вы хотите отправить на сервер следующее (без форматирования):

{"request":{"gtype":"ProductName","query":"xbox"}}

Чтобы выполнить это,вы хотите что-то вроде этого:

var req = { request : { qtype: "ProductName", query: "xbox" }};

$.ajax({
  data: JSON.stringify(req),
  // Remaining $.ajax() parameters
});

Имейте в виду, что request, qtype и query должны соответствовать вашей серверной структуре с точностью до регистра.

Вы также можете быть более многословным в определении объекта запроса (который я лично предпочитаю, чтобы все было понятно и читабельно):

var req = { };

req.request = { };

req.request.qtype = "ProductName";
req.request.query = "xbox";

Я написал немного больше об этом здесь, если выЗаинтересованы: http://encosia.com/2009/04/07/using-complex-types-to-make-calling-services-less-complex/

1 голос
/ 06 июля 2010

Как выглядит метод кода на стороне сервера? Установите точку останова. Это даже ударил?

Это должно выглядеть примерно так:

[WebMethod, ScriptMethod]
public string updateProductsList(string qtype, string query)
{ // stuff
}

Кроме того, ваши параметры данных JavaScript не выглядят правильно отформатированными.

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