2011-05-31 2 views
1

Salut J'ai ce que l'un de mes contrôleurs:Comment récupérer mongo objet db et retourner comme objet JSON

[HttpPost] 
     public JsonResult GetPinPoints(string Id) 
    { 
     Frames rslt = null; 

     string connString = ConfigurationManager.ConnectionStrings["MongoConnStringNew"].ToString(); 
     MongoUrl murl = new MongoUrl(connString); 
     MongoServer mgconf = new MongoServer(murl); 
     try 
     { 
      mgconf.Connect(); 
      MongoDatabase frmlydb = mgconf.GetDatabase("framely"); 
      MongoCollection<Frames> collection = frmlydb.GetCollection<Frames>("Frames"); 
      ObjectId oid = new ObjectId(Id); 
      Frames frms = collection.FindOne(Query.EQ("_id", oid)); 

      if (frms != null) 
      { 
       rslt = frms; 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
     finally 
     { 
      mgconf.Disconnect(); 
     } 

     return Json(rslt.CoordinatesObj.ToJson()); 
    } 

L'objet mongo ressemble à ceci:

{"MetaTagsObj":{"Meta1":"my fam","Meta2":"lololo","Meta3":"lulz"},"PictureID":"http://framely.s3.amazonaws.com/0b7a9a72-c61b-4dec-a814-40b003072e31.jpg","UserID":"1","CoordinatesObj":[{"Position":1,"Top":182,"Left":20,"Height":73,"Width":90},{"Position":2,"Top":69,"Left":103,"Height":98,"Width":1... 

J'utilise un ajax fonction jquery pour appeler le contrôleur qui ressemble à ceci:

$("#mybutton").click(function(){ 
      $.ajax({ 
       url: '/Member/GetPinPoints', 
       type: "POST", 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       success: function(data) { 
      alert(data); 
      }, 
      error: function() { 

      alert("error"); 
      } 
      }); 


    return false; 
}); 

Je ne pense pas que je fais ce droit, je pense que je Cela a à voir avec la façon dont je renvoie l'objet JSON. Je continue à obtenir cette erreur: { «Référence d'objet non définie à une instance d'un objet »}

là où je retourne l'objet JSON.

+0

Avez-vous essayé sans toJSON méthode? comme ceci: retourne Json (rslt.CoordinatesObj); – elranu

+0

@elranu ouais j'ai essayé, mais toujours la même erreur – anthonypliu

Répondre

0

La déclaration return Json(myObject) devrait prendre un objet qui va être publié en feuilleton à JSON est ensuite retourné au navigateur comme une chaîne, mais en appelant ToJson() l'objet rslt.CoordinatesObj sera sérialisé deux fois.

Il est également possible que CoordinatesObj ne soit pas déserisé correctement, donc il lance une exception car ToJson() est appelée sur un objet nul. La classe Frames devrait ressembler à ceci pour gérer deserialising le tableau CoordinatesObj:

public class Frames 
{ 
    IEnumerable<Coordinate> CoordinatesObj { get; set; } 

    public class Coordinate 
    { 
     int Position { get; set; } 
     int Top { get; set; } 
     int Left { get; set; } 
     int Height { get; set; } 
     int Width { get; set; } 
    } 
} 
0

Si FindOne ne trouve pas un document correspondant retourne null, donc dans votre exemple de code, il est tout à fait possible pour le « RSLT » variable à être nul.

aussi:

  1. pas besoin d'appeler Connect, le pilote se connecte automatiquement
  2. Do not » déconnexion de l'appel, il interfère avec connexion mise en commun