Novamente problema com jquery, ajax e bd

27/02/2014

0

Fiz um join com duas tabelas para popular um menu em uma pagina web. Bem, na tabela mãe eu possuo registros únicos e na filha, claro tenho vários registros para um nregistro da mãe. Até aí beleza. Quando eu trago no join, digamos 12 registros(minha realidade atual), que equivalem a x registros para cada um na mãe. Isso está correto. Bem, o que passa é na função jquery, eu não estou conseguindo popular o campo mãe(título do menu), devido a essa situação no retorno da função, pois ela traz vários registros e eu só preciso de um. Bem não sei se é isso. Veja a query e minha jquery.

[HttpPost]
        public JsonResult MontaMenuInferior()
        {
            AgaxturCmsEntities db = new AgaxturCmsEntities();
            try
            {
                var resultado =
                    (from c in db.TB_MENUSUPERIOR_CATEGORIAS
                     join s in db.TB_MENUSUPERIOR_SUBCATEGORIAS on c.id equals (s.Id_Categoria)
                     where c.Ativo == 1 && s.Ativo == 1 && s.CdCliente == 1
                     select new
                     {
                         c.id
                         ,c.Categoria
                         ,s.Id_Categoria
                         ,s.SubCategoria
                     }).ToList();

                return Json(new { resultado }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { resultado = ex.Message }, JsonRequestBehavior.AllowGet);
            }
        }

Agora minha jquery e o html que vai ser populado.

function MontaMenuInferior() {

            $.ajax({
                url: '/Home/MontaMenuInferior',
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                type: "POST",
                success: function (data) {
                   
                    $(data.resultado).each(function () {

                        alert(this.id);

                        if (this.Id == 2) {
                            $("#americasul").append('<li><a href="#" title="' + this.Categoria + '" alt="" >' + this.Categoria + '</a></li>');
                            if (this.Id_Categoria == this.Id) {
                                $("#americasul").append('<li><a href="#" title="' + this.SubCategoria + '" alt="" >' + this.SubCategoria + '</a></li>');
                            }
                        }

                        if (this.Id == 6) {
                            alert(this.Id);
                            $("#brasil").append('<li><a href="#" title="' + this.Categoria + '" alt="" >' + this.Categoria + '</a></li>');
                            if (this.Id_Categoria == this.Id) {
                                $("#brasil").append('<li><a href="#" title="' + this.SubCategoria + '" alt="" >' + this.SubCategoria + '</a></li>');
                            }
                        }
                    });
                },
                error: function (error) {

                }
            });
        }


Meu html

<ul class="grid_4" id="brasil">
                          
                        </ul>
                        <ul class="grid_4" id="americasul">
                            
                        </ul>
Pjava

Pjava

Responder

Posts

27/02/2014

Pjava

Tentei fazendo uma subquery, porem estou com um problema. Preciso retornar na sub, todos os elementos equivalentes na tabela principal. Se eu coloco um ToList() no final da subquery, não retorna nada. Coloquei um FirstOrDefault, retornou certo, mas apenas um registro(o primeiro, claro). Como eu faço para resolver isso? Abaixo minha linq com subquery.

[HttpPost]
        public JsonResult MontaMenuInferior()
        {
            AgaxturCmsEntities db = new AgaxturCmsEntities();
            try
            {
                var resultado =
                    (from c in db.TB_MENUSUPERIOR_CATEGORIAS
                     //join s in db.TB_MENUSUPERIOR_SUBCATEGORIAS on c.id equals (s.Id_Categoria)
                     where c.Ativo == 1 
                     select new
                     {
                         c.id
                         ,c.Categoria
                         ,sub = (from s in db.TB_MENUSUPERIOR_SUBCATEGORIAS where s.Id_Categoria == c.id
                                 && s.Ativo == 1 && s.CdCliente == 1
                                    select new { s.Id_Categoria, s.SubCategoria }) ==>> NESSE PONTO NÃO SEI O QUE COLOCAR
                     }).ToList();

                return Json(new { resultado }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { resultado = ex.Message }, JsonRequestBehavior.AllowGet);
            }
        } 
Responder

27/02/2014

Murilo Teixeira

Ficou meio confuso mas vou dar uma sugestão:

Você tem: MÃE => N FILHOS;

Então MÃE tem uma Lista de FILHOS.

        public class TB_MENUSUPERIOR_SUBCATEGORIAS
        {
             public int Id_Categoria { get; set; }
             public int Ativo { get; set; }
             public int CdCliente  { get; set; }
        }

        public class TB_MENUSUPERIOR_CATEGORIAS
        {
            public List<TB_MENUSUPERIOR_SUBCATEGORIAS> ListaFilho { get; set; }
            public int id { get; set; }
            public string Categoria { get; set; }
            public int Ativo { get; set; }
        }

        public void Carregar()
        {
            var listaMae = from c in db.TB_MENUSUPERIOR_CATEGORIAS
                     where c.Ativo == 1
                     select new
                     {
                         c.id,
                         c.Categoria,
                     }.ToList();

            foreach (var mae in listaMae)
            {
                mae.ListaFilho = from s in db.TB_MENUSUPERIOR_SUBCATEGORIAS
                     where mae.id = s.Id_Categoria && s.Ativo == 1 && s.CdCliente == 1
                     select new
                     {
                         s.Id_Categoria,
                         s.SubCategoria
                     }.ToList();
            }
        }


No retorno do jquery vc terá dois foreach... o primeiro percorrendo o data.resultado adicionando o 1o elemento, ai fazendo o segundo foreach percorrendo o this.ListaFilho;
Responder

27/02/2014

Pjava

Só uma pergunta. No seu exemplo vc deu um void e como eu pegaria no jquery o result desse cara?
Responder

27/02/2014

Murilo Teixeira

o void foi só pra mostrar, esse código você colocaria dentro da sua função que retorna o seu json...


     [HttpPost]
        public JsonResult MontaMenuInferior()
        {
            AgaxturCmsEntities db = new AgaxturCmsEntities();
            try
            {
                var resultado = from c in db.TB_MENUSUPERIOR_CATEGORIAS
                                where c.Ativo == 1
                                select new
                                {
                                    c.id,
                                    c.Categoria,
                                    ListaSubMenu = from s in db.TB_MENUSUPERIOR_SUBCATEGORIAS
                                                   where c.id = s.Id_Categoria && s.Ativo == 1 && s.CdCliente == 1
                                                   select new
                                                   {
                                                       s.Id_Categoria,
                                                       s.SubCategoria
                                                   }.ToList(),
                               }.ToList();
 
                return Json(new { resultado }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { resultado = ex.Message }, JsonRequestBehavior.AllowGet);
            }
        }
Responder

28/02/2014

Pjava

Em realidade a subquery já estava retornando sim. Eu é que estava fazendo de forma errada. Deu certo Veja como ficou minha jquery.

function MontaMenuInferior() {

    var str = "";
    $.ajax({
        url: '/Home/MontaMenuInferior',
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        type: "POST",
        success: function (data) {
                   
            $(data.resultado).each(function () {

                str = str + '<ul class="grid_4">' +
                                    '<li>' + this.Categoria + '</li>';
                                       

                $(this.subconsulta).each(function () {

                    str = str + '<li><a href="#" title="">' + this.SubCategoria + '</a></li>';
                });

                str = str + '</ul>';

                $('#menufooter').append(str);

                str = "";
                       
            });
        },
        error: function (error) {

        }
    });
}
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar