直接在客户端访问JSON对象的属性

时间:2012-02-04 02:28:10

标签: jquery asp.net-mvc webforms

我的任务是将一页的ASP.NET MVC 3 Web应用程序转换为ASP.NET 3.5 Web Forms应用程序,因为它与Sharepoint有些不兼容。我无法在Web窗体应用程序的json结果中访问对象的属性。谁能告诉我我做错了什么?此外,在使用Web表单返回json数据时,最好使用WCF服务还是常规Web服务?谁能给我一些例子?使用内置的Javascript序列化程序或JSON.net库是否更好?这是我的代码 -

MVC方法 -

public ActionResult LoadPerson()
{
   var p = new Person;
   p.Name = "Bob";    
   return Json(new { value = p}, JsonRequestBehavior.AllowGet); //what is the equivalent of this in webforms so I can access the properties directly?
}

MVC javascript文件 -

var person;
    $.ajax({
            url: 'Home/LoadPerson',           
            type: 'GET',
            async: false,
            contentType: 'application/json;',
            dataType: 'json',
            success: function (result) {
                person = result.value;
            }
        });
alert(person.Name); //works fine.

Web窗体代码隐藏 -

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public static string LoadPerson()
    {
        var p = new Person();
        p.Name = "Bob";                
        var serializer = new JavaScriptSerializer();
        return serializer.Serialize(p);
    }

Web表单javascript -

var person;
     $.ajax({
            url: 'Default.aspx/LoadPerson',
            type: 'POST',  
            async: false,
            contentType: 'application/json;',
            dataType: 'json',
            success: function (result) {
                person = result.d;
            }
        });

alert(person.Name); //undefined. Why?

1 个答案:

答案 0 :(得分:1)

您的问题是由于手动JSON序列化页面方法的响应。在对来自服务的响应运行JSON.parse()之后,jQuery将保留一个JSON字符串,而不是具有.Name等属性的对象。

ASP.NET automatically handles that step(在内部使用JavaScriptSerializer,不能少)。如果您只是返回对象并让ASP.NET处理转换,它应该按预期工作:

[WebMethod]
public static Person LoadPerson()
{
    var p = new Person();
    p.Name = "Bob";                

    return p;
}

有关更详细的说明,请参阅此帖子:http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/


在您更改代码时,我建议您避免使用async: false方法。由于JavaScript在单个共享线程中运行,并且在大多数浏览器中与UI呈现共享该线程,因此任何同步代码都会引入一系列性能问题。这甚至可能导致您的脚本呈现无响应的脚本对话框,让您的用户可以选择取消其执行。