无法获取jQuery Ajax来解析JSON webservice结果

时间:2010-07-06 19:48:42

标签: ajax json jquery

我已经验证了我的C#Webmethod的JSON响应,所以我不相信这是问题所在。

我试图使用简单的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" /> 

和Serverside Webmethod:

 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 个答案:

答案 0 :(得分:1)

您的服务器端代码方法是什么样的?设定一个断点。它甚至被击中了?

它应该类似于:

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

此外,您的javascript数据参数看起来格式不正确。

答案 1 :(得分:1)

在我看来,您的问题是您尝试使用手动JSON序列化。有更直接的方式。您应该只声​​明[ScriptMethod (ResponseFormat = ResponseFormat.Json)][ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]并返回直接返回对象而不是web方法中的字符串。在客户端(在JavaScript中)我严格建议您使用JSON.stringify(来自json2.js,可以从http://www.json.org/js.html下载)来构建data jQuery.ajax参数}}

查看Can I return JSON from an .asmx Web Service if the ContentType is not JSON?How do I build a JSON object to send to an AJAX WebService?可能还有JQuery ajax call to httpget webmethod (c#) not working您对更多实验感兴趣。

答案 2 :(得分:1)

您可能遇到的一个问题是,在您启动$ .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.
    });
  });
});

我也同意Oleg你应该使用json2.js进行JSON字符串化和解析。在较新的浏览器中,这将回溯到浏览器的这些方法的本机实现,这更快,并使解析更安全。

<强>更新

要回答有关数据的问题,不要看起来不太正确。

您最终要发送到服务器的是这个(没有格式化):

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

要做到这一点,你需要这样的东西:

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

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

请注意,requestqtypequery必须与服务器端结构相匹配,并且区分大小写。

您在定义请求对象时也会更加冗长(我个人更喜欢这样做,以保持清晰易读):

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/