How to screen a serialized object?

Asked

Viewed 121 times

2

I’m trying to convert an object that contains a relationship and Serializando afim, to send it to View by Ajax. I have two related classes

public class Eventos : IEntidade<EventosAuditoria>
{
    [Key]
    public int ID { get; set; }
    public Guid ProfissionalId { get; set; }

    [Required(ErrorMessage = "O Nome não pode ser em branco!")]
    [StringLength(50, ErrorMessage = "Maximo de 30 caracteres!")]
    public string title { get; set; }

    public DateTime start { get; set; }
    public String HoraEvento { get; set; }
    //public String DuracaoEvento { get; set; }
    public DateTime end { get; set; }

    public bool Consulta { get; set; }

    public bool Retorno { get; set; }

    public String Observacoes { get; set; }

    //relacionamento com tabela profissional
    public virtual Profissional Profissional { get; set; }
}

And my Professional class

[Table("Profissional")]
public class Profissional : IEntidade<ProfissionalAuditoria>
{
    [Key]
    public Guid ProfissionalId { get; set; }

    public String Nome { get; set; }

    public bool Ativo { get; set; }

    //Relacionamento com tabela eventos
    public virtual ICollection<Eventos> Eventos { get; set; }
}

But when trying to inform the value of Professionalid on the screen, as follows:

public JsonResult ObtemPorId(int id)
{
    var evento = Db.Eventos.FirstOrDefault(e => e.ID == id);
    return Json(evento, JsonRequestBehavior.AllowGet);
}

It comes as 00000-0000-0000... So looking for some ways to resolve, I saw that with the library Json.net is possible. But, I had some problems in the implementation. Follow them below.

eventClick: function(calEvent, jsEvent, view) {
   $.ajax({
   url: '/Home/ObtemPorId',
   Type: 'POST',
   data: $('#ID').val(calEvent.ID),
   success: function(response) {
      $('#editEventTitle').val(response.title);
      $('#editEventDate').val(response.start);
      $('#editEventTime').val(response.end);
      ModalAdicionar(response)//Aqui passo o os dados recebidos para o modal
     }
});

function ModalAdicionar(date) {
            ClearPopupFormValues();
            $('#ModalAdicionar').modal('show');
            $('#eventTitle').focus();
        }

and in my controller, I try to return the data serialized

public JsonResult ObtemPorId(int id)
{
    var evento = Db.Eventos.FirstOrDefault(e => e.ID == id);
    var result = JsonConvert.SerializeObject(evento, Formatting.Indented,
    new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
    return Json(result, JsonRequestBehavior.AllowGet);
}

However, the result that comes to me in the Response is something like that

"Profissional": {
 "Eventos": [
 {
     "ID": 3,

     "ProfissionalId": "47961ca9-4a6e-451b-b984-2123134587fa",

     "title": "Renan Carlos",

    "start": "2017-05-31T12:00:00",
     "HoraEvento": null,
     "end": "2017-05-31T12:30:00",
     "Consulta": false,
     "Retorno": false,
     "Observacoes": null,
     "DataCriacao": "2017-05-30T15:14:37.053",
     "UsuarioCriacao": "[email protected]",
     "UltimaModificacao": null,
     "UsuarioModificacao": null
   },
   {
     "ID": 4,
     "ProfissionalId": "47961ca9-4a6e-451b-b984-2123134587fa",
     "title": "Renan",
     "start": "2017-05-31T11:30:00",
     "HoraEvento": null,
     "end": "2017-05-31T12:00:00",
     "Consulta": false,
     "Retorno": false,
     "Observacoes": null,
     "DataCriacao": "2017-05-30T15:32:08.897",
     "UsuarioCriacao": "[email protected]",
     "UltimaModificacao": null,
     "UsuarioModificacao": null ...

Which is something quite different than expected. And changing this line

new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });

To:

new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Serialize});

I have this message:

'System.Data.Entity.DynamicProxies.Eventos_e1047acbd21cea4b87c1021ce8fefedfe86c5ac747e6d7ff7170add1a1872419'.

How can I do this implementation ? Ps: I need to pass the information of Professionalid, contained in Events.

  • If you only need Professionalid, could just use return Content(evento.ProfissionalId.ToString());

  • @Ricardopunctual I expressed myself badly, I did the editing

2 answers

0

public JsonResult ObtemPorId(int id)
{
    var evento = Db.Eventos.FirstOrDefault(e => e.ID == id);
    return Json(result, JsonRequestBehavior.AllowGet);
}

Just try this, I think it should work.

  • That way it doesn’t work. I edited the question by entering more details and explaining what I’ve tried and why it didn’t work.

  • can you explain better what doesn’t work? and you want to return the right Event object?

  • that is.. of some mistake?

0

Try placing the attribute below in the classes you want to serialize:

[JsonObject(IsReference = true)]
public class Eventos : IEntidade<EventosAuditoria>
{
...
}

and

[JsonObject(IsReference = true)]
[Table("Profissional")]
public class Profissional : IEntidade<ProfissionalAuditoria>
{
...
}
  • With this I use I don’t need Json.Net methods in the controller ?

  • I like to use the Newtonsoft.Json library that you can get via Nuget.In the API only return like return Json(MyObject)

  • I’m using her.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.