2012-03-14 14 views
0

sendDataというJavascript関数があります。この機能を使用することで、JSJson DeserializeObjectエラー戻り値

var sendData = function (data) { 
     alert("The following data are sending to the server"); 
     var dataToSend = JSON.stringify(data); 
     alert(dataToSend); 
     $.ajax({ 
      type: "POST", 
      url: "Submit", 
      dataType: "json", 
      data: dataToSend, 
      contentType: "application/json; charset=utf-8", 
      success: function (response, textStatus, jqXHR) { 
       alert("success"); 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       alert("fail"); 
      } 
     }); 
    }; 

、私はその後、私はhttp://jsonlint.com/を使用して、それを確認しdataToSend

[{"Seminar_Code":"CMP04","Speaker":"1","Tag":"1","DateAndTime":""}, {"Seminar_Code":"CMP04","Speaker":"2","Tag":"2","DateAndTime":""},{"Seminar_Code":"CMP04","Speaker":"3","Tag":"3","DateAndTime":""}] 

の値を見ることができます。それは有効です。

次に、コントローラレイヤで以下のコードを使用します。

[AcceptVerbs(HttpVerbs.Post)] 
    //[JsonFilter(Parameter = "seminar_detail", JsonDataType = typeof(Seminar_Detail))] 
    public ActionResult Submit(JsonResult Jresult) 
    { 
     //var ttt = JsonConvert.DeserializeObject(Request["jsonString"], typeof(List<Seminar_Detail>)); 
     //var result = (new JsonSerializer()).Deserialize<List<Seminar_Detail>>(seminar_detail); 
     //var result = JsonConvert.DeserializeObject<List<Seminar_Detail>>(seminar_detail.ToString()); 

     var result = JsonConvert.DeserializeObject<List<Seminar_Detail>>(Jresult.ToString()); 
     return View(); 
    } 

次に、このエラーが発生します。

JsonReaderException was unhandled by user code 
Unexpected character encountered while parsing value: S. Line 0, position 0. 

Immediate window from vs 2010 IDE --- > Jresult.Dataを使用すると、nullが返されます。即時ウィンドウ

Jresult.ToString() 
"System.Web.Mvc.JsonResult" 
Jresult.Data.ToString() 
'Jresult.Data' is null 
Jresult.Data 
null 

結果、私はNewtonsoft.Json and Asp.net MVC 4を使用しています。 このエラーを解決する方法を教えてください。

答えて

3

よう

data: { 'result': dataToSend } 

とあなたのコントローラを試してみましたモデル:

public class Seminar 
{ 
    public string Seminar_Code { get; set; } 
    public string Speaker { get; set; } 
    public string Tag { get; set; } 
    public string DateAndTime { get; set; } 
} 

、その後はあなたのコントローラのアクションはパラメータとして、このビューモデルのリストを取ることがあります。

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Submit(IEnumerable<Seminar> seminars) 
{ 
    ... don't need to use any JSON serializers here. 

    return View(); 
} 

あなたが作成することができますが、古いバージョンを使用している場合、これは、ASP.NET MVC 3

で動作しますカスタムJsonValueProviderFactoryfollowing blog postで説明しています。

ただし、コントローラにシリアル化インフラストラクチャコードを入れないでください。オブジェクトをシリアライズ/デシリアライズするのはコントローラの責任ではありません。

+0

ありがとうございましたあなたの提案は本当に優れています、ダーリンディミトロフに感謝します。 –

+0

提案したようにすることで、 'Newtonsoft.Json' APIを使う必要はありません。 –

+0

私は正しいですか? @ダリン –

0

コントローラーにstring型の引数を設定し、Newtonsoft.Jsonを使用してそれを逆シリアル化します。

JSONResultはActionResult型であり、アクション引数として使用しないでください。

はまた、あなたがやってみ呼び出すAJAXであなたが最初のビューを作成し、

のように、モデルバインダーは、あなたのためにそれをデシリアライズさせる

public ActionResult Submit(IEnumerable<Seminar_Detail> result) 
    { 
    .... 
+0

ありがとうございます@labroo、私は提案したように私のコードを変更しました。その後、 'public ActionResult Submit(IEnumerable result)'メソッドは起動しません。私は、送信ボタンをクリックすると私のコードはサーバーサイトには行きません。方法を教えてください。 –