2011-01-21 23 views
0

金曜日の午後遅く、私はこれを長年にわたって戦ってきました...私はJSONを返すMVC2クラスを持っています。ブラウザでデシリアライズしようとすると、JQueryがエラーをスローします。ここでJQueryを使用してMVCからJSONを逆シリアル化する方法は?

は、コントローラです:

<HttpPost()> 
Function ChangeAddress(ByVal addressId As Integer) As ActionResult 

    ' Build and return JSON containing address. 
    Dim v As New TestViewModel With {.Address1 = "My House"} 
    Return Json(v) 

End Function 

は、ここでビューモデルです:

// If list is not empty and item was found... 
if (found == true) { 

     var sum = 14; 

    // Get fields of newly selected address. 
    $.ajax({ 
     url: '../../Checkout/ChangeAddress', 
     type: 'POST', 
     traditional: true, 
      data: { addressId: sum }, 
     success: function (result) { 

      var json = result.get_data(); 
      var data = Sys.Serialization.JavaScriptSerializer.deserialize(json); 

      alert("Success!"); 

     } 
    }); 
}; 

デシリアライズコードはMVC Music Storeでの例からである。

Public Class TestViewModel 

    Public Property Address1 As String 

End Class 

そして、ここではスクリプトがあります。実行されると、JQueryはget_dataに対して例外をスローし、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」と言います。さて、私はその行をコメントアウトし、デシリアライズしようとしました(結果)。次に、例外が "Sys.ArgumentException:デシリアライズできません。データが有効なJSONに対応していません。パラメータ名:data"と表示されます。

どこが間違っていますか?

答えて

2

JSONを明示的に解析(「逆シリアル化」)する必要はありません。 dataTypeが正しく返されていれば、jQueryはこれを自動的に実行しようとします。あなた、もちろん、あなたはJSONを期待していることを指定することができます。

$.ajax({ 
    url: '../../Checkout/ChangeAddress', 
    type: 'POST', 
    dataType: 'JSON',    // <========== this line 
    traditional: true, 
    data: {addressId: sum}, 
    success: function (result) { 

     var json = result.get_data(); 
     var data = Sys.Serialization.JavaScriptSerializer.deserialize(json); 

     alert("Success!"); 
    } 
}); 

言った - それはがXHRが有効なJSONに戻って来ていないこと可能です。おそらくJSONの例をjQueryのsuccessコールバックに返してもらえますか?

+0

私は笑う必要があります。どのda'ya知っている、私は直接明示的な解析せずにAddress1の値を読み取ることができます。 MVCに新しいことは、私はこのオートマティックなものすべてがうまくいくと思っていますが、ちょっと戸惑うこともあります。マジックを説明するルールブック(ポーションブック?)はどこですか?早速の対応、ありがとうございました。 – Adventure

+0

@Adventure:http://api.jquery.com/jQuery.ajaxから始めましょう。具体的には 'dataType'オプションです。 –

関連する問題