Как извлечь объект db Монго и вернуть его как объект json - PullRequest
1 голос
/ 31 мая 2011

Привет, у меня есть один из моих контроллеров:

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

Объект монго выглядит так:

{"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...

Я использую функцию jjery ajax для вызова контроллера, который выглядит следующим образом:

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

Я не думаю, что я делаю это правильно, я думаю, что это связано с тем, как я возвращаю объект json. Я получаю эту ошибку:

{"Ссылка на объект не установлена ​​для экземпляра объекта."}

прямо туда, куда я возвращаю объект Json.

Ответы [ 2 ]

0 голосов
/ 01 июня 2011

Если FindOne не находит соответствующий документ, он возвращает ноль, поэтому в вашем примере кода вполне возможно, что переменная "rslt" будет нулевой.

Также:

  1. не нужно звонить Connect, драйвер подключается автоматически
  2. не вызывать Disconnect, это мешает с пулом подключений
0 голосов
/ 31 мая 2011

Оператор return Json(myObject) должен принимать объект, который будет сериализован в JSON, а затем возвращен браузеру в виде строки, но при вызове ToJson() объект rslt.CoordinatesObj будет сериализован дважды.

Это также возможно CoordinatesObj неправильно десерилизуется, поэтому выдает исключение, потому что ToJson() вызывается для нулевого объекта. Класс Frames должен выглядеть примерно так, чтобы обрабатывать десериализацию массива 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; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...