none
Não consigo popular dropdown com Json RRS feed

  • Discussão Geral

  • Bom dia!

    Tenho uma tela que ao digitar um código, o dropDown deve ser populado com as tarefas cadastradas com aquele código. Chamar a controller com o id  do código da certo, mas ao montar isso da um erro "POST http://localhost:11929/despesas/getTarefa 500 (Internal Server Error)"

    Minha controller:

    [HttpPost]
            public JsonResult getTarefa(string idObra)
            {
                int id = Convert.ToInt32(idObra);
                var tarefa = db.tarefaaplicacao.Where(x => x.IdObra == id).ToList();
    
                List<tarefaaplicacao> lista = tarefa;
    
                return Json(new { ok = true, data = lista, message = "ok" });
            }

    Meu javascript

    function loadTarefas() {
            alert("numero da obra: " + $("#numeroObra").val());
            codigoObra = $("#numeroObra").val();
            var urlemp = '@Url.Action("getTarefa")';
            
            var select = $('#ddlTaref');
    
            $.ajax({
                type: "POST",
                url: urlemp,
                data: { idObra: codigoObra },
                success: function (returndata) {
                    if (returndata.ok) {
                        window.alert("combo populado");
                        select.empty();
                        $.each(returndata.data, function (index, itemData) {
                            select.append($('<option></option>').val(itemData.Id).html(itemdata.Nome));
                        });
                        select.show('slow');
                    }
    
                    else {
                        window.alert('error :' + returndata.message);
                    }
                }
            });
     }


    sexta-feira, 26 de outubro de 2012 13:00

Todas as Respostas

  • Se está ocorrendo erro 500 é porquê está ocorrendo algum erro dentro do seu método getTarefa, debuga linha por linha pra ver onde está acontecendo..

    Provalvemente na linha

    db.tarefaaplicacao.Where(x => x.IdObra == id).ToList();

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    sexta-feira, 26 de outubro de 2012 13:12
  • Opa, obrigado por colaborar ^^

    O problema é que no debug da certo, a variavel lista do tipo List<tarefaaplicacao> recebe o retorno de tarefa que contem os objetos que eu quero. Talvez o tipo de retorno que estou fazendo não pode ser iterado...  mas ai não sei como proceder.

    sexta-feira, 26 de outubro de 2012 14:20
  • Em produção você diz que está ocorrendo o erro?

    Verificou se existe registros na tabela tarefaaplicacao com o id passado? Caso contrário vai dar erro no ToList().


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    sexta-feira, 26 de outubro de 2012 14:48
  • Existem registros sim, estou testando apenas com um id, e ele possui 2 registros e são alocados a lista normalmente. No debug até apresenta os itens.

    sexta-feira, 26 de outubro de 2012 17:03
  • Descobri o problema "

    Foi detectada uma referência circular ao serializar um objeto do tipo 'Sacer.Models.Obra'.

    "

    O problema é que apesar de ser um relacionamento de 0.1 -> N, o entity criou uma propriedade em cada tabela, qual q melhor forma de proceder?

    sexta-feira, 26 de outubro de 2012 18:37
  • Dá um Select nas propriedades que você quer:

    db.tarefaaplicacao.Select(t => new {t.Id,t.Nome}).Where(x => x.IdObra == id).ToList();

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    sexta-feira, 26 de outubro de 2012 18:53
  • Agora ta tudo certo, ja consigo retornar os objetos, mas da um erro falando que "Uncaught ReferenceError: itemdata is not defined". Vejo esse erro pelo firebug, meu metodo ajax segue:

        function loadTarefas() {
            alert("numero da obra: " + $("#numeroObra").val());
            codigoObra = $("#numeroObra").val();
            var urlemp = '@Url.Action("getTarefa")';
            
            var select = $('#ddlTaref');
    
            $.ajax({
                type: "POST",
                url: urlemp,
                data: { idObra: codigoObra },
                success: function (returndata) {
                    if (returndata.ok) {
                        window.alert("combo populado");
                        select.empty();
                        $.each(returndata.data, function (index, itemData) {
                            select.append($('<option></option>').val(itemData.Id).html(itemdata.Nome));
                        });
                        select.show('slow');
                    }
    
                    else {
                        window.alert('error :' + returndata.message);
                    }
                }
            });
     }

    segunda-feira, 29 de outubro de 2012 11:11
  • O javascript é case sensitive, no seu código você declara itemData mas usa itemdata.Nome.

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    segunda-feira, 29 de outubro de 2012 11:15
  • Exatamente, mas depois de corrigir isso, não da mais erro, só que também não preenche o select. E os objetos são retornados corretamente.

    • Editado Kakashi963 segunda-feira, 29 de outubro de 2012 12:06
    segunda-feira, 29 de outubro de 2012 12:06
  • $.each(returndata.data, function (index, itemData) {
         select.append('<option value=' + itemData.Id + '>' + itemData.Nome + '</option>');
    });


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    segunda-feira, 29 de outubro de 2012 12:13
  • Cara deu muito certo, realmente obrigado.
    • Editado Kakashi963 segunda-feira, 29 de outubro de 2012 13:15
    segunda-feira, 29 de outubro de 2012 13:04
  • E não dá nenhum erro de js?

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    segunda-feira, 29 de outubro de 2012 13:12