JSON function Returns no value [closed]

2

I have a problem, I would like to populate my DropDownlistFor with the result of another DropDownListFor, so I'm using Ajax and Json, same concept they make when they want the result from State to City.

Model:

    public class SegmentMOD
        {
            public int id { get; set; }

            [DisplayName("Segmento")]
            public string nome { get; set; }
        }
            public class SectorMOD
        {
            public int id { get; set; }

            [DisplayName("Setor")]
            public string nome { get; set; }

            public int segmentId { get; set; }
        }

Controller:

    OpportunityController: Controller
    {

    public ActionResult Cadastrar()
            {
                //Aqui funciona normal, retorna os valores
                ViewBag.segmentList = new SelectList(new SegmentREP().ListarTodos(),
                    "id",
                    "nome"
                );

                return View();
            }
            //vai preencher o Where com o Id do segment
            public async Task<JsonResult> CarregarSector(int id)
        {
            var setor = new SectorREP().ListarTodos().Where(x => x.segmentId ==id);

            return Json(setor, JsonRequestBehavior.AllowGet);
        }

    }

View:

    @{
        ViewBag.Title = "Cadastrar";
    }

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script><script>$(document).ready(function(){$("#segment").change(function () {
            listaCidade($(this).val());
        });
    });

    //chamada ajax para a Action ListaCidade
    //passando como parâmetro a Estado selecionado
    function listaCidade(segmentId) {
        //Chamando o metodo do controller para retornar um JSON
        $.ajax({
            url: '/Opportunity/CarregarSector',
            type: 'POST',
            data: { id: segmentId },
            dataType: 'json',
            success: function (result) {
                $("#sector").empty();
                $(result).each(function () {
                    //adicionando as opções de acordo com o retorno
                    $("#sector").append("<option value='" + this.id + "'>" + this.nome + "</option>");
                });
            },
            error: function () {
                alert('Erro! Não foi possível carregar os Setores.');
            }
        });

    }
</script>



        <h2>Cadastrar</h2>


                                                <div class="col-md-4">
        @Html.LabelFor(model => model.segment, htmlAttributes: new { @class = "control-label" })

        @Html.DropDownListFor(model => model.segment, (SelectList)ViewBag.segmentList, new { @class = "form-control selectpicker show-tick", data_live_search = "true", id = "segment" })
        @Html.ValidationMessageFor(model => model.segment, "", new { @class = "text-danger" })

                            <select class="form-control" id="sector"></select>

                        </div>
    
asked by anonymous 17.12.2015 / 14:29

2 answers

2
Model:

        public class SegmentMOD
            {
                public int id { get; set; }

                [DisplayName("Segmento")]
                public string nome { get; set; }
            }
                public class SectorMOD
            {
                public int id { get; set; }

                [DisplayName("Setor")]
                public string nome { get; set; }

                public int segmentId { get; set; }
            }

    Controller:

        OpportunityController: Controller
        {

        public ActionResult Cadastrar()
                {
                    //Aqui funciona normal, retorna os valores
                    ViewBag.segmentList = new SelectList(new SegmentREP().ListarTodos(),
                        "id",
                        "nome"
                    );

                    return View();
                }
                //vai preencher o Where com o Id do segment
                public async Task<JsonResult> CarregarSector(int id)
            {
                var setor = new SectorREP().ListarTodos().Where(x => x.segmentId ==id);

                return Json(setor, JsonRequestBehavior.AllowGet);
            }

        }

    View:

        @{
            ViewBag.Title = "Cadastrar";
        }

            <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script><script>$(document).ready(function(){$("#segment").change(function () {
                listaSector($(this).val());
            });
        });

        //chamada ajax para a Action CarregarSector
        //passando como parâmetro o Segmento selecionado
        function listaSector(segmentId) {
            //Chamando o metodo do controller para retornar um JSON
            $.ajax({
                url: '/Opportunity/CarregarSector',
                type: 'POST',
                data: { id: segmentId },
                dataType: 'json',
                success: function (result) {
                    $("#sector").empty();
                    $(result).each(function () {
                        //adicionando as opções de acordo com o retorno
                        $("#sector").append("<option value='" + this.id + "'>" + this.nome + "</option>");
                    });
                },
                error: function () {
                    alert('Erro! Não foi possível carregar os Setores.');
                }
            });

        }
    </script>



            <h2>Cadastrar</h2>


                                                    <div class="col-md-4">
            @Html.LabelFor(model => model.segment, htmlAttributes: new { @class = "control-label" })

            @Html.DropDownListFor(model => model.segment, (SelectList)ViewBag.segmentList, new { @class = "form-control selectpicker show-tick", data_live_search = "true", id = "segment" })
            @Html.ValidationMessageFor(model => model.segment, "", new { @class = "text-danger" })

                                <select class="form-control" id="sector"></select>

                            </div>
    
08.01.2016 / 15:15
0

One solution would be to generate the direct html code in the controller.

 //Gera options do selectlist
  StringBuilder strHtml = new StringBuilder();
  strHtml.Append("<option value='0'>Selecione...</option>");
  foreach ( var sector in sectorList )
  {
       //Para cada resultado encontrado gera uma option para o selectlist
       strHtml.AppendFormat("<option value='{0}'>{1}</option>", sector.id, sector.nome);
  }
       //retorna html referente ao selectlist sector
       return Json(new { options = strHtml.ToString() });

And in the return of the ajax function give the append of the options in the corresponding select.

 success: function (result) {
            $("#sector").empty();
            $("#sector").html(result.options);
        },
    
18.12.2015 / 21:08