2012-03-14 5 views
0

J'ai une fonction Javascript appelée sendData.Json DeserializeObject Erreur de retour

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"); 
      } 
     }); 
    }; 

En utilisant cette fonction js, je peux voir la valeur de 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":""}] 

Ensuite, je l'ai vérifié à l'aide http://jsonlint.com/. C'est valide Ensuite, j'utilise le code ci-dessous à Controller Layer.

[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(); 
    } 

Ensuite, j'obtiens cette erreur.

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

En utilisant Immediate window from vs 2010 IDE --- > Jresult.Data, j'obtiens une valeur nulle.

Résultat de la fenêtre immédiate

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

J'utilise Newtonsoft.Json and Asp.net MVC 4. S'il vous plaît laissez-moi savoir comment résoudre cette erreur.

Répondre

3

Créer une vue modèle:

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

puis ont votre action de contrôleur prendre une liste de ce modèle de vue en tant que paramètre:

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

    return View(); 
} 

Cela fonctionne dans ASP.NET MVC 3.

Si vous utilisez une version plus ancienne, vous pouvez créer un JsonValueProviderFactory personnalisé comme expliqué dans le following blog post et toujours garder le modèle dans votre action.

Mais dans tous les cas, ne mettez pas de code d'infrastructure de sérialisation dans vos contrôleurs. Ce n'est pas la responsabilité d'un contrôleur de sérialiser/désérialiser des objets.

+0

Votre suggestion est vraiment excellente, Merci beaucoup @Darin Dimitrov. –

+0

En faisant ce que vous avez suggéré, je n'ai pas besoin d'utiliser l'API 'Newtonsoft.Json'. –

+0

Ai-je raison? @Darin –

0

faites votre argument controller de type string, puis utilisez Newtonsoft.Json pour le désérialiser. JSONResult est de type ActionResult et ne doit pas être utilisé comme argument d'action.

aussi avez-vous essayé d'abord laisser le modèle Binder désérialiser pour vous, comme

en vous ajax appelez essayer de faire,

data: { 'result': dataToSend } 

et votre contrôleur comme

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

Merci @labroo, j'ai changé mon code comme vous l'avez suggéré. Après cela, la méthode public ActionResult Submit (IEnumerable result) 'ne se déclenche pas. Je veux dire, quand je clique sur le bouton soumettre, mon code ne va pas sur le site du serveur. Pourriez-vous s'il vous plaît me suggérer comment. Merci –