quinta-feira, 15 de agosto de 2013

Combos que carregam outros combos

Em um projeto que estou mexendo tem um combo de Estado que recarrega um combo de Cidade. Para fazer isso, um $.get é feito para uma Action, ela retorna um Json e esse Json é transformado em HTML no javascript.

Action:
        public ActionResult PegarPorEstado(Int32 id)
        {
            var cidades = cidadeService.PegarCidadePorEstado(id).ToList();

            var nomeCidade = new String[cidades.Count];
            var idCidade = new Int32[cidades.Count];
            var aux = 0;

            foreach (var item in cidades)
            {
                nomeCidade[aux] = item.Nome;
                idCidade[aux] = item.ID;
                aux = aux + 1;
            }

            return Json(new { nomeCidade, idCidade }, JsonRequestBehavior.AllowGet);
        }

Javascript:
    $.getJSON(urlCidadesPorEstado, { id: uf },

        function (data) {
            var optionsValues = '';

            for (var i = 0; i < data.nomeCidade.length; i++) {
                optionsValues += '<option value="' + data.idCidade[i] + '">' + data.nomeCidade[i] + '</option>';
            }

            $('.select-cidades option:not(:first-child)').remove();
            $('.select-cidades option:first-child').after(optionsValues);

        }
    );


O que eu usei quando precisei fazer isso em outro projeto foi uma partial. Ela é inserida na View e é o retorno da Action que é chamada via get. Simplifica o javascript (que não precisa escrever campos, apenas trocar o HTML de um pedaço da página) e unifica o lugar onde é criado o combo de Cidades.

Action:
        public ActionResult PegarPorEstado(Int32 id)
        {
            var model = new MeuModel();
           
            model.Cidades = cidadeService.PegarCidadePorEstado(id).ToList();

            return PartialView("MinhaPartial", model);
        }



Javascript:
    $.getJSON(urlCidadesPorEstado, { id: uf },

        function (data) {

            $('.select-cidades').parent().html(data);

        }
    );


A Partial seria o trecho de código onde está o DropDown de cidades, e herdaria o mesmo Model da View original. Ela teria que ser inserida sozinha dentro de um elemento na View original, para o novo javascript funcionar sem comer outros códigos.

terça-feira, 13 de agosto de 2013

Entry point not found

Esbarrei neste erro quando tentei usar DropDownListFor em um projeto de MVC4:

"Entry point not found"

Nem vou entrar nos detalhes de stacktrace porque não ajudaram muito.

Depois de muito virar o código, descobri que estava procurando no lugar errado. Removi e inseri diversas vezes a System.Web.Mvc e a System.Web.Webpages do meu projeto MVC, quando deveria ter substituído essas libraries em um projeto do qual ele dependia, uma biblioteca que criei com helpers para MVC.

Nota: não esquecer de verificar não apenas o projeto onde o erro está, como aqueles dos quais ele depende.