2009-09-24 10 views
0

Y at-il des problèmes avec l'utilisation de types anonymes avec la méthode JSON() dans asp.net mvc?Types anonymes et JsonResult dans ASP.NET MVC

J'ai récemment eu un problème avec le renvoi d'un type anonyme d'un Linq .First() qui ne fonctionnerait pas lors de son renvoi à l'appelant jQuery. J'ai créé une sous-classe simple à l'intérieur de mon contrôleur et des valeurs assignées simples à partir de l'objet de requête et qui semblaient sérialiser et fonctionnaient correctement.

Cela a fonctionné:

public class JsonJob 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public DateTime DateAdded { get; set; } 
    public DateTime? DateModified { get; set; } 
}; 

var jsonJob = from job in db.Jobs 
       where job.Id == jobId 
       select new JsonJob 
       { 
        Id = job.Id, 
        Title = job.Title, 
        Description = job.Description, 
        DateAdded = job.DateAdded, 
        DateModified = job.DateModified 
       }; 

return Json(jsonJob.First()); 

Mais cela n'a pas:

var jsonJob = from job in db.Jobs 
       where job.Id == jobId 
       select job; 

return Json(jsonJob.First()); 
+1

Décrivez "ne fonctionnerait pas" plus en détail –

+0

Ne déclencherait pas le rappel de succès. Le code du contrôleur est appelé avec succès. – James

Répondre

2

Votre deuxième requête ne renvoie pas un type anonyme. Il renvoie probablement un type d'entité (généré par le générateur de code DataContext à partir du fichier DBML), ce qui peut avoir un tas de choses que vous n'aimez pas. De retour d'un type anonyme ne devrait pas poser un problème car la méthode Json ne se soucie pas du nom du type du tout:

// anonymous type example: 
var jsonJob = from job in db.Jobs 
       where job.Id == jobId 
       select new { // Note that no class name is specified here 
       job.Id, 
       job.Title, 
       job.Description, 
       job.DateAdded, 
       job.DateModified 
       }; 
+0

Si je fais un 'select new {Id = job.Id, Title = job.Title};' Le résultat est le même. L'utilisation d'un type défini réel semble fonctionner. – James

+0

James: Quel est le résultat final? –

+0

Le rappel de succès de la page n'est jamais appelé. Donc, quelque chose fait flipper $ .getJSON. – James

2

Je sais que c'est un ancien, mais j'ai eu ce problème et ceci est le premier solution dans Google; Ce n'était pas lié à la classe anonyme - c'était juste parce que j'avais oublié de retourner mes résultats avec AllowGet, par exemple.

return Json(result, JsonRequestBehaviour.AllowGet); 

Bien qu'il ne jette pas une erreur C#, vous pouvez facilement confirmer avec un virage dans la fonction Application_Error() dans Global.asax.cs ou voir l'erreur 500 dans Fiddler.

+0

A travaillé pour moi, moins le «u» dans Behaviour – jamier