【问题标题】:Frustrated with Json Response对 Json 响应感到沮丧
【发布时间】:2011-05-29 14:37:06
【问题描述】:

所以这是我的问题。我正在使用 Jquery 的 $.ajax 将一系列值传递回 Web 方法。 Web 方法获取值,创建一个对象,然后将其作为 json 发送回调用页面。收到回复后,我将无法访问回复并显示其值。

谁能解释我需要做什么才能完成这项工作?

jquery 脚本:

$(document).ready(function() {
    $("#create").click(function() {
        var name = $('#name').val();
        var company = $('#company').val();
        var location = $('#location').val();
        var phonenumber = $('#phonenumber').val();
        var country = $('#country').val();

        $.ajax({
            type: "POST",
            url: "WebService.asmx/MakeEmployee",
            data: "{name:'" + name +
                          "',company:'" + company +
                          "',location:'" + location +
                          "',phonenumber:'" + phonenumber +
                          "',country:'" + country +
                          "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
                AjaxSucceeded(msg.d);
            }
        });
    });

    function AjaxSucceeded(data) {
        //var item = jQuery.parseJSON(data) // this doesn't work for me.
        $("#response").html(
            "<ul><li> " + data.Name +
            "</li><li> " + data.Company +
            "</li><li> " + data.Address +
            "</li><li> " + data.Phone +
            "</li><li> " + data.Country +
            "</ul> "
            );
        };
  });

网络方法:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string MakeEmployee(string name, string company, 
              string location, string phoneNumber, string country)
{
    Employee e = new Employee(name, company, location, phoneNumber, country);
    return new JavaScriptSerializer().Serialize(e);
}

我得到的回应是:

{"d":"\"Name\":\"bob\",
          \"Company\":\"google\",
          \"Address\":\"home\",
          \"Phone\":\"123\",
          \"Country\":\"usa\"}"}

这是我认为我应该回来的:

{"Name":"bob",
     "Company":"google",
      "Address":"home",
      "Phone":"123",
      "Country":"usa"}

页面再次呈现后我得到的错误是:

•undefined
•undefined
•undefined
•undefined
•undefined

【问题讨论】:

  • 我并没有像你在这里那样做,但我会尝试摆脱你对JavaScriptSerializer的使用。只需返回您的 Employee 类,框架就会为您将其转换为 Json。
  • 你是对的。 JavaScriptSerializer() 部分对我的 json 响应做了一些时髦的事情。感谢您的提示!

标签: c# asp.net json jquery


【解决方案1】:

你的响应已经被解析为 JSON,所以它已经是一个对象了……不需要再次解析,直接使用它,像这样:

function AjaxSucceeded(data) {
    $("#response").html(
        "<ul><li> " + data.Name +
        "</li><li> " + data.Company +
        "</li><li> " + data.Address +
        "</li><li> " + data.Phone +
        "</li><li> " + data.Country +
        "</ul> "
    );
}

{ d: ... } 包装器由 ASP.Net 添加,这是正常行为。之后您的问题是元素未正确返回,您需要从 ASP.Net 返回一个 object 而不是 string,最好是这样:

[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Employee MakeEmployee(string name, string company, 
  string location, string phoneNumber, string country) {
    return new Employee(name, company, location, phoneNumber, country);
}

...Employee 在 JavaScript 端具有您想要的属性。让 ASP.Net 在这里处理序列化而不是直接进行,整体上您会得到更清晰的响应。

【讨论】:

  • 我不需要使用新的 JavaScriptSerializer().Serialize(e);部分网络方法。一旦我把它拿出来并从服务器返回一个对象,其他一切都到位了。
【解决方案2】:

尝试将此 ajax initaliazer 函数用于 asp.net ajax。它设置了大多数默认值,因此您只需提供 url/params 只需先调用您的 document.ready() 函数,然后再调用。

function jqueryInit() {
$.ajaxSetup({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    data: "{}",
    dataFilter: function (data) {
        var msg;
        if (typeof (JSON) !== 'undefined' &&
                typeof (JSON.parse) === 'function')
            msg = JSON.parse(data);
        else
            msg = eval('(' + data + ')');

        if (msg.hasOwnProperty('d'))
            return msg.d;
        else
            return msg;
    }
});

}

【讨论】:

    【解决方案3】:

    从清理您的服务方法开始。你真的不需要这个构造函数和所有这些属性。你已经有一个Employee 类型,所以使用它:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public Employee MakeEmployee(Employee e)
    {
        // Maybe do something more useful here with this employee
        // like raise his salary
        return e;
    }
    

    然后清理你的javascript:

    $.ajax({
        type: 'POST',
        url: 'WebService.asmx/MakeEmployee',
        data: JSON.stringify({
            // All those correspond to Employee properties you would like to pass
            Name: $('#name').val(),
            Company: $('#company').val(),
            Location: $('#location').val(),
            PhoneNumber: $('#phonenumber').val(),
            Country: $('#country').val()
        }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function(msg) {
            // msg.d is gonna be the returned employee
            AjaxSucceeded(msg.d);
        }
    });
    

    【讨论】:

    • “JSON.stringify”到底是什么?
    • @Chris,它将对象转换为像 { Name: 'foo', Company: 'bar' } 这样的 JSON 字符串,并将该字符串传递给 web 方法。现代浏览器内置了它,但对于较旧的浏览器,您可以从这里下载它:json.org/js.html。它避免了正确编码属性的所有麻烦。
    • 非常好。我以前没见过那个。我将修改代码,看看它对我的效果如何。感谢您的信息!
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2014-07-21
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多