2012-02-04 71 views
1

由於與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? 

回答

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呈現來共享該線程,所以任何同步代碼都會引入大量性能問題。這甚至可能導致腳本呈現無響應的腳本對話框,讓用戶可以選擇取消其執行。

+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