none
problema con viewbag null RRS feed

  • Pregunta

  • Hola a todos!

    tengo una vista sencilla en la que cargo el dropdown list TERRITORIOID en función de lo seleccionado en el PAISID

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

    la corresondiente función javascritp

        function CargarTerritorios() {
            var lPais = $('#PAISID').val();
            var url = '/CENTROes/BindTerritorios';
            $.get(url, { 'paisid': lPais }, function (listadoTerritorios) {
                        $("#TERRITORIOID").html("");
                        $.each(listadoTerritorios, function (i, territorio) {
                            $("#TERRITORIOID").append(
                                $('<option></option>').val(territorio.COORDINADORID).html(territorio.DESCRIPCION));
                        });
            });

        }

    En el controlador tengo lo siguiente:

            public ActionResult Create()
            {

                ViewBag.PAISID = new SelectList(db.PAIS, "PAISID", "DESCRIPCION");
                var listadoTerritorios = from u in db.TERRITORIOs
                                         where 1 < 0
                                         select new { TERRITORIOID = u.TERRITORIOID, DESCRIPCION = u.DESCRIPCION };//lo cargo vacio la primera vez.
                ViewBag.TERRITORIOID = new SelectList(listadoTerritorios, "TERRITORIOID", "DESCRIPCION");
                return View();
            }

            public ActionResult BindTerritorios(decimal paisid)
            {
                var listadoTerritorios = from u in db.TERRITORIOs
                                           where (u.PAISID == paisid )
                                           select new { PAISID = u.PAISID, DESCRIPCION = u.DESCRIPCION };
                ViewBag.TERRITORIOID = new SelectList(listadoTerritorios, "TERRITORIOID", "DESCRIPCION");
      
                return Json(listadoTerritorios, JsonRequestBehavior.AllowGet);
            }

    Lanzo la aplicación selecciono país, me carga los territorios, selecciono el territorio y doy al botón guardar. Pues me da un error como que no he seleccionado ningún territorio, el TERRITORIOID me viene a null.

            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create([Bind(Include = "CENTROID,DESCRIPCION,PAISID,TERRITORIOID,FECHAREGISTRO,ESTADO")] CENTRO cENTRO)
            {

                if (ModelState.IsValid)//-> aquí me dice que el TERRITORIOID esta a nulo!
                {
                    decimal _id = (db.CENTRO.ToList()).Max(p => p.CENTROID);

                    cENTRO.CENTROID = _id + 1;
                    TERRITORIO tERRITORIO = db.TERRITORIOs.Find(cENTRO.TERRITORIOID);
                    cENTRO.TERRITORIO = tERRITORIO;
                    cENTRO.PAISID = cENTRO.TERRITORIO.PAISID;
                    cENTRO.PAIS = cENTRO.TERRITORIO.PAI;
                    cENTRO.FECHAREGISTRO = DateTime.Now;

                    db.CENTRO.Add(cENTRO);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }

            } // esta claro que me falta incluir el TERRITORIOID  en el viewbag, pero no se como hacerlo. Gracias por si alguien me puede ayudar

    miércoles, 10 de mayo de 2017 14:54

Respuestas

  • Hola DaniDeveloper

    Veo que deseas guardar un listado en viewbag?, deberías utilizar ViewData["listaPais"] por ejemplo y con ello trabajar.

    Te dejo un artículo interesante MVC Options for Passing Data

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.


    miércoles, 10 de mayo de 2017 15:01
  • Hola,

    El tema de viewdata no solo era cambiarlo, es venir con el listado desde que lo trabajas en el js.

    Por otro lado, la solución que estás aplicando ahora solo te funcionará si tienes el modelo

      @Html.DropDownListFor(x => x.TerritoID, new SelectList(Model.TerritoriListado, "TerritorioID", "TerritorioName"), "Select Territorio")

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    • Marcado como respuesta DaniDeveloper miércoles, 10 de mayo de 2017 15:49
    miércoles, 10 de mayo de 2017 15:44
  • Hola DaniDeveloper

    Si gustas, puedes orientarte con estos ejemplos:

    Simple Cascading DropDownList

    Cascading DropdownList in ASP.NET MVC  viewData

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    • Marcado como respuesta DaniDeveloper jueves, 11 de mayo de 2017 7:59
    miércoles, 10 de mayo de 2017 16:37
  • hola

    pero defines un model para la view ? porque si es asi porque no usas el

    @Html.DropDownListFor(m=> m.TERRITORIOID, ViewBag.TERRITORIOID, htmlAttributes: new { @class = "form-control"})

    es mas no deberias llamarlo de la misma forma, podrias usar

    ViewBag.TERRITORIOLIST = new SelectList(listadoTerritorios, "TERRITORIOID", "DESCRIPCION");

    entonces en la view

    @Html.DropDownListFor(m=> m.TERRITORIOID, ViewBag.TERRITORIOLIST, htmlAttributes: new { @class = "form-control"})


    de esta forma la propiedad del model difiere a la lista del viewbag

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper miércoles, 10 de mayo de 2017 15:35
    miércoles, 10 de mayo de 2017 15:14
  • hola

    tiene que usar el

    @Html.DropDownListFor()

    es con un For al final

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper miércoles, 10 de mayo de 2017 16:12
    miércoles, 10 de mayo de 2017 16:04
  • hola

    no veo que tiene que ver un json, esto no aplica con el ViewBag, estas queriendo cargar la lista mediente ajax ? porque para eso se usa el $.ajax de jquery

    lo que estas planteando es incorrecto, si usas json no aplica el Html.DropDownListFor() tienes que usas javascript

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper jueves, 11 de mayo de 2017 7:59
    miércoles, 10 de mayo de 2017 16:53

Todas las respuestas

  • Hola DaniDeveloper

    Veo que deseas guardar un listado en viewbag?, deberías utilizar ViewData["listaPais"] por ejemplo y con ello trabajar.

    Te dejo un artículo interesante MVC Options for Passing Data

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.


    miércoles, 10 de mayo de 2017 15:01
  • hola

    pero defines un model para la view ? porque si es asi porque no usas el

    @Html.DropDownListFor(m=> m.TERRITORIOID, ViewBag.TERRITORIOID, htmlAttributes: new { @class = "form-control"})

    es mas no deberias llamarlo de la misma forma, podrias usar

    ViewBag.TERRITORIOLIST = new SelectList(listadoTerritorios, "TERRITORIOID", "DESCRIPCION");

    entonces en la view

    @Html.DropDownListFor(m=> m.TERRITORIOID, ViewBag.TERRITORIOLIST, htmlAttributes: new { @class = "form-control"})


    de esta forma la propiedad del model difiere a la lista del viewbag

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper miércoles, 10 de mayo de 2017 15:35
    miércoles, 10 de mayo de 2017 15:14
  • Hola Brayan, gracias por la contestación.

    He probado a cambiar el ViewBag por ViewData y el error sigue igual.

    miércoles, 10 de mayo de 2017 15:28
  • Buenas Leandro, gracias por contestar.

    Si esta definido en el modelo el territorioid

    he probado ha montarlo como dices y me da el siguiente error.

    Mensaje de error del compilador: CS1660: Cannot convert lambda expression to type 'string' because it is not a delegate type

    Error de código fuente:

    Línea 30:                             <label class="control-label col-md-2">Territorio</label>
    Línea 31:                             <div class="col-md-10">
    Línea 32:                                 @Html.DropDownList(model => model.TERRITORIOID, ViewBag.LTERRITORIO, htmlAttributes: new {class = "form-control"})
    Línea 33:                                 @Html.ValidationMessageFor(model => model.TERRITORIOID, "", new {class = "text-danger"})
    Línea 34:                             </div>

    miércoles, 10 de mayo de 2017 15:37
  • Hola,

    El tema de viewdata no solo era cambiarlo, es venir con el listado desde que lo trabajas en el js.

    Por otro lado, la solución que estás aplicando ahora solo te funcionará si tienes el modelo

      @Html.DropDownListFor(x => x.TerritoID, new SelectList(Model.TerritoriListado, "TerritorioID", "TerritorioName"), "Select Territorio")

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    • Marcado como respuesta DaniDeveloper miércoles, 10 de mayo de 2017 15:49
    miércoles, 10 de mayo de 2017 15:44
  • hola

    tiene que usar el

    @Html.DropDownListFor()

    es con un For al final

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper miércoles, 10 de mayo de 2017 16:12
    miércoles, 10 de mayo de 2017 16:04
  • la carga inicial en el controlador

    ViewBag.LTERRITORIO = db.TERRITORIOs;

    la vista

    @Html.DropDownListFor(model => model.TERRITORIOID, new SelectList(ViewBag.LTERRITORIO, "TERRITORIOID", "DESCRIPCION") ,  htmlAttributes: new {@ class = "form-control"})

    y el método que actualiza el desplegable al saltar el evento del pais

            [HttpPost]
            public ActionResult 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 Json(listadoTerritorios, JsonRequestBehavior.AllowGet);
            }

    yo creo que el fallo viene porque además de hacer el return json hay que hacer el return view. se que las dos cosas no se pueden hacer, pero... no se... voy a tener que buscar otro modo.

    miércoles, 10 de mayo de 2017 16:33
  • Hola DaniDeveloper

    Si gustas, puedes orientarte con estos ejemplos:

    Simple Cascading DropDownList

    Cascading DropdownList in ASP.NET MVC  viewData

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    • Marcado como respuesta DaniDeveloper jueves, 11 de mayo de 2017 7:59
    miércoles, 10 de mayo de 2017 16:37
  • hola

    no veo que tiene que ver un json, esto no aplica con el ViewBag, estas queriendo cargar la lista mediente ajax ? porque para eso se usa el $.ajax de jquery

    lo que estas planteando es incorrecto, si usas json no aplica el Html.DropDownListFor() tienes que usas javascript

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta DaniDeveloper jueves, 11 de mayo de 2017 7:59
    miércoles, 10 de mayo de 2017 16:53
  • Gracias por tu aporte Brayan.

    Retomaré este tema en unos días y tendré en cuenta lo que me has comentado.

    jueves, 11 de mayo de 2017 8:04
  • Lo que he hecho lo hecho basándome en algún ejemplo que he encontrado por internet.

    Soy nuevo con MVC y todavía estoy verde. Retomaré esto en unos días y tendré en cuenta lo que me has comentado. Gracias Leandro.

    jueves, 11 de mayo de 2017 8:06