none
Problema con carga en cascada de dropdownlist. MVC RAZOR AJAX RRS feed

  • Pregunta

  • Hola!

    Estoy realizando la típica carga de un dropdownlist en función del valor seleccionado en otro.

    Vista:

    @Html.DropDownList("PAISID", null, htmlAttributes: new {@ class = "form-control", onchange = "CargarTerritorios();" })

    @Html.DropDownList("TERRITORIOID", null, htmlAttributes: new { @class = "form-control" })

        function CargarTerritorios() {
            debugger;
            var lPais = $('#PAISID').val();
            var url = '/CENTROes/BindTerritorios';
            $.ajax({
                url: url,
                cache: false,
                type: "POST",
                data: { paisid: lPais },
                success: function (listadoTerritorios) {
                    alert(listadoTerritorios);
                    //$("#TERRITORIOID").html("");
                    //$.each(listadoTerritorios, function (i, territorio) {
                    //    $("#TERRITORIOID").append(
                    //          $('<option></option>').val(territorio.COORDINADORID).html(territorio.DESCRIPCION));
                    //});
                },
                error: function () {
                    alert("failed");
                }

            });

    y controller:

            [HttpPost]
            public PartialViewResult BindTerritorios(decimal paisid)
            {
                var listadoTerritorios = from u in db.TERRITORIOs
                                           where (u.PAISID == paisid )
                                           select new { PAISID = u.PAISID, DESCRIPCION = u.DESCRIPCION };
                ViewBag.LTERRITORIO = listadoTerritorios;           
                return PartialView();
            }

    Al seleccionar un país llego perfectamente al BindTerritorios del controller pero al pasar el return PartialView(); la respuesta al Ajax es por el error, me sale el alert('failed');

    Alguien me puede decir que problema tengo? Gracias!!!

    martes, 16 de mayo de 2017 10:02

Respuestas

  • hola

    >>relleno el nombre y le doy a guardar. entonces en ese caso me falla al guardar porque no tengo el territorioid

    pero en la clase model que recibes el post al guardar validas que mapee el name del control select con la propiedad del model

    recuerda que lo importante es el name

    <select id="TERRITORIOID" name="TERRITORIOID" class="form-control" >

    en el submit se usa el name no el id

    slaudos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper miércoles, 17 de mayo de 2017 13:39
    martes, 16 de mayo de 2017 14:58
  • hola

    Pero si usas javascript para cargar las listas para que usas Html.DropDownList() define un <select> en html y listo

    el helper se usa cuando vas a renderizar los datos enviados desde el controller

    <select id="PAISID" class="form-control" onchange="CargarTerritorios();">
    </select>

    no tiene sentido usar los helper donde no aplicas nada desde el model

    >>del controller pero al pasar el return PartialView(); la respuesta al Ajax es por el error, me sale el alert('failed');

    porque PartialView ? tienes que retornar un json

    [HttpPost]
    public JsonResult BindTerritorios(decimal paisid)
    {
    	var listadoTerritorios = from u in db.TERRITORIOs
    							   where (u.PAISID == paisid )
    							   select new { PAISID = u.PAISID, DESCRIPCION = u.DESCRIPCION };
             
    	return Json(listadoTerritorios);
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper martes, 16 de mayo de 2017 11:05
    martes, 16 de mayo de 2017 10:44

Todas las respuestas

  • hola

    Pero si usas javascript para cargar las listas para que usas Html.DropDownList() define un <select> en html y listo

    el helper se usa cuando vas a renderizar los datos enviados desde el controller

    <select id="PAISID" class="form-control" onchange="CargarTerritorios();">
    </select>

    no tiene sentido usar los helper donde no aplicas nada desde el model

    >>del controller pero al pasar el return PartialView(); la respuesta al Ajax es por el error, me sale el alert('failed');

    porque PartialView ? tienes que retornar un json

    [HttpPost]
    public JsonResult BindTerritorios(decimal paisid)
    {
    	var listadoTerritorios = from u in db.TERRITORIOs
    							   where (u.PAISID == paisid )
    							   select new { PAISID = u.PAISID, DESCRIPCION = u.DESCRIPCION };
             
    	return Json(listadoTerritorios);
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper martes, 16 de mayo de 2017 11:05
    martes, 16 de mayo de 2017 10:44
  • hola Leandro,

    tienes razón en tu comentario pero si hago como tu dices y devuelvo el json después cuando trato de guardar los datos no tengo el valor del territorio.

    estoy trabajando con entity models.

    tengo la siguiente entidad

    Model.CENTRO que tiene lo siguiente

    - paísid

    - territorioid

    - nombreCentro

    en la vista selecciono país, cargo los territorios con json sin problema, relleno el nombre y le doy a guardar. entonces en ese caso me falla al guardar porque no tengo el territorioid. por eso estoy tratando de hacer la carga del territorio de otro modo en el que al cargar el dropdownlist asigne al modelo el territorioid.

    martes, 16 de mayo de 2017 11:11
  • hola

    >>relleno el nombre y le doy a guardar. entonces en ese caso me falla al guardar porque no tengo el territorioid

    pero en la clase model que recibes el post al guardar validas que mapee el name del control select con la propiedad del model

    recuerda que lo importante es el name

    <select id="TERRITORIOID" name="TERRITORIOID" class="form-control" >

    en el submit se usa el name no el id

    slaudos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper miércoles, 17 de mayo de 2017 13:39
    martes, 16 de mayo de 2017 14:58