2012-02-04 7 views
1

Sharepointに互換性がないため、1ページのASP.NET MVC 3 WebアプリケーションをASP.NET 3.5 Webフォームアプリケーションに変換する任務がありました。 Webフォームアプリケーションのjson結果でオブジェクトのプロパティにアクセスできません。誰かが私が間違っていることを教えてもらえますか?また、Jsonデータを返すためにWebフォームを使用する場合は、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には、.Nameのようなプロパティを持つオブジェクトの代わりにJSON文字列が残ります。

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

+0

私はまた、Webサービスの代わりにWCFルートを行くことをお勧めあなたの投稿を読んだ。それについてどうすればいいですか?ありがとう! – tempid

+0

@ user349308:AJAX呼び出し用のJSONエンドポイントが必要な場合は、今やっていることは良いアプローチです。 WCFの高度な機能や柔軟性が必要ない場合、WCFの複雑さを正当化するのは難しいです。 –

関連する問題