1

Tengo 2 vistas 'create', en la primera tengo 2 DropDownListFor para mostrar los Departamentos y Oficinas de la institución, éste es el código:

    <div class="form-group">
        @Html.LabelFor(model => model.IdDpto, htmlAttributes: new { @class = "control-label col-lg-2" })
        <div class="col-lg-4">
            @Html.DropDownListFor(model => model.IdDpto, (SelectList)ViewBag.DptoList, "Seleccione Departamento", new { id = "cboDpto", @class = "form-control" })
            @Html.ValidationMessageFor(model => model.IdDpto, "", new { @class = "text-danger" })
        </div>
        @Html.LabelFor(model => model.IdOficina, htmlAttributes: new { @class = "control-label col-lg-2" })
        <div class="col-lg-4">
            @Html.DropDownListFor(model => model.IdOficina, (SelectList)ViewBag.OficinaList, "Seleccione Oficina", new { id = "cboOficina", @class = "form-control" })
            @Html.ValidationMessageFor(model => model.IdOficina, "", new { @class = "text-danger" })
        </div>
    </div>

Agregué el siguiente código JQuery para que al seleccionar Departamento, se actualice la lista de Oficinas:

    $("#cboDpto").change(function () {
        const dptoId = $(this).val();
        $.ajax(
            {
                url: '/Inventario/ObtenerOficinas?IdDpto=' + dptoId,
                type: 'POST',
                data: "",
                contentType: 'json; charset=utf-8',
                success: function (data) {
                    $('#cboOficina').empty();
                    $(data).each(function (i, row) {
                        $('#cboOficina').append('<option value="' + row.IdOficina + '">' + row.Oficina + '</option>');
                    })
                },
            }
        )
    });

Como funciona bien, repliqué el mismo código en mi segunda vista 'create'. El problema es que en esta segunda vista, al dar clic en Guardar me sale el siguiente error:

System.InvalidOperationException: 'El elemento ViewData con la clave 'IdDpto' es de tipo 'System.Int32' pero debe ser de tipo 'IEnumerable'.'

Muestro el código de la segunda vista por si alguien detecte algo diferente que pudiera estar causando el error:

    <div class="form-group" style="margin-bottom: 8px;">
        <div class="col-lg-4">
            @Html.DropDownListFor(model => model.IdDpto, (SelectList)ViewBag.DptoList, "Seleccione Departamento", new { id = "cboDpto", @class = "form-control" })
            @Html.ValidationMessageFor(model => model.IdDpto, "", new { @class = "text-danger" })
        </div>
        <div class="col-lg-8">
            @Html.DropDownListFor(model => model.IdOficina, (SelectList)ViewBag.OficinaList, "Seleccione Oficina", new { id = "cboOficina", @class = "form-control" })
            @Html.ValidationMessageFor(model => model.IdOficina, "", new { @class = "text-danger" })
        </div>
    </div>

Y el JQuery de esa vista:

    $("#cboDpto").change(function () {
        const dptoId = $(this).val();
        $.ajax(
            {
                url: '/RT/ObtenerOficinas?IdDpto=' + dptoId,
                type: 'POST',
                data: "",
                contentType: 'json; charset=utf-8',
                success: function (data) {
                    $('#cboOficina').empty();
                    $(data).each(function (i, row) {
                        $('#cboOficina').append('<option value="' + row.IdOficina + '">' + row.Oficina + '</option>');
                    })
                },
            }
        )
    });

En el controlador el código para llenar las listas desplegables es el siguiente:

VISTA 1

        ClsOperaciones<Dptos> dptos = new ClsOperaciones<Dptos>(ConfigurationManager.ConnectionStrings["SoporteConnection"].ToString());
        ViewBag.DptoList = new SelectList(dptos.GetDataSP("sp_Dptos"), "IdDpto", "Dpto");

VISTA 2

        ClsOperaciones<Dptos> dptos = new ClsOperaciones<Dptos>(ConfigurationManager.ConnectionStrings["SoporteConnection"].ToString());
        ViewBag.DptoList = new SelectList(dptos.GetDataSP("sp_Dptos"), "IdDpto", "Dpto");

En el modelo he verificado que IdDpto tiene el mismo tipo de dato (int) en ambos casos.

No logro detectar el porque del error

De antemano agradezco su apoyo

Probé con estos cambios: En el Modelo Agregué lo siguiente:

    public List<Dptos> DptoList { get; set; }

En el Controlador, en GET hice la siguiente modificación:

        RtEdit.DptoList = dptos.GetDataSP("sp_Dptos");

En la vista hice estos cambios:

            @Html.DropDownListFor(model => model.IdDpto, new SelectList(Model.DptoList, "IdDpto", "Dpto"), "Seleccione Departamento", new { id = "cboDpto", @class = "form-control" })

Ahora al dar clic en el botón Guardar me sale este error: System.ArgumentNullException: 'El valor no puede ser nulo. Nombre del parámetro: items'

No hago mención al POST del controlador porque puse puntos de interrupción ahí, pero ni siquiera llega al POST, el error es detectado antes.

2
  • Como es el código del controlador? Hay diferencias entry GET y POST?
    – Duston
    Commented el 24 jun. a las 18:22
  • En el Get se establece el ViewBag y el Return, en el post se hace validación se inserta y return. Puse punto de interrupción en el post, pero no llega ahí, el error sale antes. Commented el 24 jun. a las 20:59

0

Examina otras preguntas con la etiqueta o formula tu propia pregunta.