none
Pasar valor Id de un dropdownlist a un controlador en mvc RRS feed

  • Pregunta

  • Hola a todos

    Anteriormente habia hecho una pregunta que ya se resolvió.

    Sin embargo me surgió otra duda, tengo dos procedimientos almacenados mapeados en entityframework, uno para llenar el dropdownlist (GetDepartamentos_Result) y otro para llenar un webgrid dependiendo de la selección que haga en el dropdownlist(SearchEmployeesDropDown_Result).

    La cuestion es que por lo que he leido no se pueden tener dos modelos en una vista por lo que hice un nuevo modelo que contegan mis dos modelos de mis stored procedure quedando de la siguiente manera: 

    namespace WebgridPagingSortingFiltering.Models
    {
        public class ViewModels
        {
            public List<GetDepartamentos_Result> Combo { get; set; }
            public List<SearchEmployeesDropDown_Result> Grid { get; set; }
            public int SelectedDeparmentID { get; set; }
        }
    }

    agregue una nueva propiedad SelectedDeparmentID para el valor del Id del dropdownlist.

    En mi controlador tengo lo siguiente dos métodos uno para llenar el dropdownlist y otro para poblar el wegrid:

    Para llenar el drop:

    public List<GetDepartamentos_Result> GetDepartamentos()
            {
                using (TigerEntities db = new TigerEntities())
                {
                    ViewModels vm = new ViewModels();
                    vm.Combo = db.GetDepartamentos().ToList();
                    return vm.Combo;
                }
            }

    Para llenar el webgrid:

    public List<SearchEmployeesDropDown_Result> GetEmpleadosbyDrop (int Id_dep)
            {
                using (TigerEntities db = new TigerEntities())
                {
                    ViewModels vm = new ViewModels();
                    vm.Grid = db.SearchEmployeesDropDown(Id_dep).ToList();
                    return vm.Grid;
                }
            }

    Y tengo un metodo actionresult que me carga los datos en la vista para el dropdownlist:

     public ActionResult Combo()
            {
                var a = GetDepartamentos();
                ViewBag.Departamentos = new SelectList(a, "Id_Departamento", "Nombre_Departamento");
                return View(b);
            }

    En mi vista tengo lo siguiente:

    @model WebgridPagingSortingFiltering.Models.ViewModels

    @{
        Layout = null;
        var grid = new WebGrid(canPage: true, rowsPerPage: 4);
        grid.Bind(source: Model.Grid, rowCount: ViewBag.TotalRows);
    }

     @using (Html.BeginForm("combo", "home", FormMethod.Post, new { @class = "navbar-form navbar-left" }))
                        {
                            <div class="form-group">
                                @Html.DropDownListFor(model => model.SelectedDeparmentID, ViewBag.Departamentos as SelectList, new { @class = "form-control" })
                            </div>
                            <button type="submit" value="Search" class="btn btn-success">Search</button>
                        }

    Mi duda es como paso el valor del id del dropdownlist al controlador para que haga el filtrado con el stored procedure que he hecho y me muestre los datos en el webgrid. 

    Tengo el mismo metodo actionresult pero no se que pasarle como parametro:

    [HttpPost]
            public ActionResult Combo(??) No se si pasarle el modelo ViewModels o el SelectedDeparmentID
            {
                var a = GetDepartamentos();
                ViewBag.Departamentos = new SelectList(a, "Id_Departamento", "Nombre_Departamento");
                var b = GetEmpleadosbyDrop(??);
                return View(b);
            }

    Agradeceria mucho su ayuda que me puedan proporcionar


    Carlos David Frias

    viernes, 12 de enero de 2018 17:52

Respuestas

  • duda 1:

    Una de mis dudas es que si en el ActionResult que es post tengo que volver a llamar a mi metodo GetDepartamentos para que llene el combo o lo puedo dejar asi:

     [HttpPost]
            public ActionResult Index(int SelectedIdDepartamento)
            {
                var b = GetEmpleadosbyDrop(SelectedIdDepartamento); 
                return View(b);
            }

    La solución aqui es en lugar de devolver la vista, hacer un redirectToAction a la accion index del GET pasandole el parametro departameto y ese ya te cargará todo actualizado luego al volver a la vista, es decir: 

    [HttpPost]
            public ActionResult Index(int SelectedIdDepartamento)
            {
                var v = GetDepartamentosCombo();
                ViewBag.Departamentos = new SelectList(v, "Id_Departamento", "Descripcion");
                var b = GetEmpleadosbyDrop(SelectedIdDepartamento); 
                return REdirectToAction("index", new RouteValues {SelectedIdDepartamento=SelectedIdDepartamento }) // o algo asi no rcuerto;
            }

    El error del grid no te puedo ayudar.

    lunes, 15 de enero de 2018 8:13

Todas las respuestas

  • Pasale el SelectedDeparmentID del tipo int directamente. Y  devuelve la vista filtrada:

        [HttpPost]
            public ActionResult Combo(int SelecDepartMentID)
            {
                var a = GetDepartamentos();
                ViewBag.Departamentos = new SelectList(a, "Id_Departamento", "Nombre_Departamento");
                var b = GetEmpleadosbyDrop(??);
                return View(b);
            }

    Aunque yo lo haria en AJAX de forma que por jqueyr llamaria al action Combo que me devolveria las 3 listas filtradas en JSON.

    sábado, 13 de enero de 2018 12:09
  • Pasale el SelectedDeparmentID del tipo int directamente. Y  devuelve la vista filtrada:

        [HttpPost]
            public ActionResult Combo(int SelecDepartMentID)
            {
                var a = GetDepartamentos();
                ViewBag.Departamentos = new SelectList(a, "Id_Departamento", "Nombre_Departamento");
                var b = GetEmpleadosbyDrop(??);
                return View(b);
            }

    Aunque yo lo haria en AJAX de forma que por jqueyr llamaria al action Combo que me devolveria las 3 listas filtradas en JSON.

    Hola vyrcyrus_,

    Muchas gracias por responder, te comento que se me complica usar ajax ya que no entiendo muy bien su uso, es por eso que que intento usar el  @using (Html.BeginForm("-......., sin embargo como seria utilizando el ajax? Habria algun ejemplo que me pudieras proporcionar?

    Y por otra parte Le pase directamente el SelectedDeparmentID ,pero al controlador me llega null, el metodo quedo asi :

    public ActionResult Index(int SelecDepartMentID) Aqui se lo paso directo
            {
                var v = GetDepartamentosCombo();
                ViewBag.Departamentos = new SelectList(v, "Id_Departamento", "Descripcion");
                var b = GetEmpleadosbyDrop(SelecDepartMentID); Y aqui llamo a mi método GetEmpleadosbyDrop y tambien se lo paso directo 
                return View(b);
            }

    En la vista tengo:

    <div class="collapse navbar-collapse">
                        @using (Html.BeginForm("index", "Empleados", FormMethod.Post, new { @class = "navbar-form navbar-left" }))
                        {
                            <div class="form-group">
                                @Html.DropDownListFor(m => m.SelecDepartMentID, ViewBag.Departamentos as SelectList, new { @class = "form-control" })
                            </div>
                            <button type="submit" value="Buscar" class="btn btn-success">Buscar</button>
                        }
                    </div>

    No entiendo que es lo que esta fallando?



    Carlos David Frias


    sábado, 13 de enero de 2018 20:18
  • No te falta [httpPost] encima del Action index ?
    domingo, 14 de enero de 2018 13:35
  • Si tienes razón, me faltaba ponerle el [httppost], ya me trae el id que selecciono, sin embargo tengo dos dudas mas que surgieron, espero me puedas explicar si no es mucha molestia. Tengo dos ActionResult Index uno que es el get y otro que es el post:

    public ActionResult Index()
            {
                var v = GetDepartamentosCombo();
                ViewBag.Departamentos = new SelectList(v, "Id_Departamento", "Descripcion");
                return View();
            }

            [HttpPost]
            public ActionResult Index(int SelectedIdDepartamento)
            {
                var v = GetDepartamentosCombo();
                ViewBag.Departamentos = new SelectList(v, "Id_Departamento", "Descripcion");
                var b = GetEmpleadosbyDrop(SelectedIdDepartamento); 
                return View(b);
            }

    Una de mis dudas es que si en el ActionResult que es post tengo que volver a llamar a mi metodo GetDepartamentos para que llene el combo o lo puedo dejar asi:

     [HttpPost]
            public ActionResult Index(int SelectedIdDepartamento)
            {
                var b = GetEmpleadosbyDrop(SelectedIdDepartamento); 
                return View(b);
            }

    Quitando las lineas:

     var v = GetDepartamentosCombo();
                ViewBag.Departamentos = new SelectList(v, "Id_Departamento", "Descripcion");

    Y la segunda duda es que al cargar la vista el webgrid me dice que es null, cuando ya le estoy devolviendo el filtrada la vista:

    var b = GetEmpleadosbyDrop(SelectedIdDepartamento); 
                return View(b);

    El error me lo manda aqui:

    @model WebGridList.Models.CustomerView
    @{
        Layout = null;
        var grid = new WebGrid(canPage: true, rowsPerPage: 4);
        grid.Bind(source: Model.Grid, rowCount: ViewBag.TotalRows); <--------Aqui me manda el error y es el siguiente
    }

    Se produjo una excepción de tipo 'System.NullReferenceException' en App_Web_24lqpuea.dll pero no se controló en el código del usuario:

    Información adicional: Referencia a objeto no establecida como instancia de un objeto.

    Si sirve de algo pongo todo el codigo que tengo:

    ViewModel:

    public class CustomerView
        {
            public List<GetDepartamentos_Result> Combo { get; set; }//Procedimiento Almacenado para el Drop
            public List<SearchEmployeesbyDrop_Result> Grid { get; set; }//Procedimiento Almacenado para el Grid
            public int SelectedIdDepartamento { get; set; }
        }

    Controller:

     public ActionResult Index()
            {
                var v = GetDepartamentosCombo();
                ViewBag.Departamentos = new SelectList(v, "Id_Departamento", "Descripcion");
                return View();
            }

            [HttpPost]
            public ActionResult Index(int SelectedIdDepartamento)
            {
                var v = GetDepartamentosCombo();
                ViewBag.Departamentos = new SelectList(v, "Id_Departamento", "Descripcion");
                var b = GetEmpleadosbyDrop(SelectedIdDepartamento); 
                return View(b);
            }

            public List<GetDepartamentos_Result> GetDepartamentosCombo()
            {
                using (TigerTeamEntities db = new TigerTeamEntities())
                {
                    CustomerView cv = new CustomerView();
                    cv.Combo = db.GetDepartamentos().ToList();
                    cv.Grid = null;
                    return cv.Combo;
                }
            }

            public List<SearchEmployeesbyDrop_Result> GetEmpleadosbyDrop(int Id_dep)
            {
                using (TigerTeamEntities db = new TigerTeamEntities())
                {
                    CustomerView vm = new CustomerView();
                    vm.Grid = db.SearchEmployeesbyDrop(Id_dep).ToList();
                    return vm.Grid;
                }
            }

    Vista:

    @model WebGridList.Models.CustomerView
    @{
        Layout = null;
        var grid = new WebGrid(canPage: true, rowsPerPage: 4);
        grid.Bind(source: Model.Grid, rowCount: ViewBag.TotalRows);//Aqui me manda el error
    }

    <!DOCTYPE html>

    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
        <link href="~/Content/bootstrap.min.css" rel="stylesheet" />
    </head>
    <body>
        <div class="container">
            <h2>Lista de Empleados</h2>
            <nav class="navbar navbar-default">
                <div class="container-fluid">
                    <div class="navbar-header">
                        <a href="#" class="navbar-brand">Buscar</a>
                    </div>
                    <div class="collapse navbar-collapse">
                        @using (Html.BeginForm("index", "Empleados", FormMethod.Post, new { @class = "navbar-form navbar-left" }))
                        {
                            <div class="form-group">
                                @Html.DropDownListFor(m => m.SelectedIdDepartamento, ViewBag.Departamentos as SelectList, new { @class = "form-control" })
                            </div>
                            <button type="submit" value="Buscar" class="btn btn-success">Buscar</button>
                        }
                    </div>
                </div>
            </nav>
            <div>
                @grid.Table(
             tableStyle: "table table-responsive table-bordered",
             columns: grid.Columns(
                 grid.Column(columnName: "Nombre", header: "Nombre"),
                 grid.Column(columnName: "Apellido", header: "Apellido"),
                 grid.Column(columnName: "Edad", header: "Edad"),
                 grid.Column(columnName: "Email", header: "Correo Electronico"),
                 grid.Column(columnName: "Sexo", header: "Sexo"),
                 grid.Column(columnName: "Pais", header: "Pais"),
                 grid.Column(columnName: "Descripcion", header: "Departamento"),
                 grid.Column(header: "", format:@<text>@Html.ActionLink("Edit", "Save", "Home", new { id = item.Id_Empleado }, new { @class = "btn btn-primary btn-md", data_toggle = "modal", data_target = "#ModalEditar" })</text>),
                 grid.Column(header: "", format:@<text>@Html.ActionLink("Delete", "Delete", "Home", new { id = item.Id_Empleado }, new { @class = "btn btn-danger btn-md", data_toggle = "modal", data_target = "#ModalEliminar" })</text>)
                    )
                )
                <div class="row">
                    <div class="col-sm-6">
                        @grid.PagerList(mode: WebGridPagerModes.All, paginationStyle: "pagination pagination-small pagination-right")
                    </div>
                </div>

                @Html.Hidden("dir", grid.SortDirection)
                @Html.Hidden("col", grid.SortColumn)

            </div>
        </div>
    </body>
    </html>

    Espero me puedas ayudar a despejar mi duda y muchas gracias por el apoyo que he recibido.


    Carlos David Frias

    lunes, 15 de enero de 2018 3:37
  • duda 1:

    Una de mis dudas es que si en el ActionResult que es post tengo que volver a llamar a mi metodo GetDepartamentos para que llene el combo o lo puedo dejar asi:

     [HttpPost]
            public ActionResult Index(int SelectedIdDepartamento)
            {
                var b = GetEmpleadosbyDrop(SelectedIdDepartamento); 
                return View(b);
            }

    La solución aqui es en lugar de devolver la vista, hacer un redirectToAction a la accion index del GET pasandole el parametro departameto y ese ya te cargará todo actualizado luego al volver a la vista, es decir: 

    [HttpPost]
            public ActionResult Index(int SelectedIdDepartamento)
            {
                var v = GetDepartamentosCombo();
                ViewBag.Departamentos = new SelectList(v, "Id_Departamento", "Descripcion");
                var b = GetEmpleadosbyDrop(SelectedIdDepartamento); 
                return REdirectToAction("index", new RouteValues {SelectedIdDepartamento=SelectedIdDepartamento }) // o algo asi no rcuerto;
            }

    El error del grid no te puedo ayudar.

    lunes, 15 de enero de 2018 8:13
  • Que tal vyrcyrus,

    Muchas gracias por tus aportes que me ha sido de mucha utilidad. Aun sigo con el problema del grid. No se si se deba al ViewModel que le paso a la Vista u otra cosa.

    Te agradezco mucho tu tiempo y espero poder encontrar la solución a mi problema.

    Saludos,


    Carlos David Frias

    martes, 16 de enero de 2018 18:20