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

问题描述:

由于与Sharepoint不兼容,我一直被委托将单页ASP.NET MVC 3 Web应用程序转换为ASP.NET 3.5 Web Forms应用程序。我无法访问Web窗体应用程序的json结果中的对象的属性。谁能告诉我我做错了什么?另外,当使用Web表单来返回JSON数据时,使用WCF服务还是常规Web服务更好?任何人都可以给我一些例子吗?使用内置的JavaScript序列化程序或JSON.net库会更好吗?这里是我的代码 -直接在客户端访问JSON对象的属性

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? 

你的问题是由于手动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呈现来共享该线程,所以任何同步代码都会引入大量性能问题。这甚至可能导致脚本呈现无响应的脚本对话框,让用户可以选择取消其执行。

+0

就是这样!非常感谢。如果我删除'asynx:false',那么Person对象可能就是null。顺便说一下,我是你网站的忠实粉丝:) – tempid 2012-02-04 03:52:31

+0

我也在你的帖子的某个地方读过你的帖子,建议你去WCF路线而不是Web服务。我该如何解决这个问题?谢谢! – tempid 2012-02-04 03:53:32

+0

@ user349308:如果您只需要一个用于AJAX调用的JSON端点,那么您现在正在做的是一个好方法。当您不需要任何高级功能或灵活性时,很难证明WCF的复杂性。 – 2012-02-04 05:29:19