none
Filtrar tabla en MVC 2 RRS feed

  • Pregunta

  • Hola a todos!, mi problema es el sgte:

    En mi control llamo a un SP que me lista la relación de cumpleaños de una empresa por mes, ejemplo:

    Dia Nombre AREA

    1 Juan Contabilidad

    15 Jose Administracion

    Ahora lo que yo necesito es mostrar en la vista la relación de cumpleaños filtrada por ÁREA es decir así:

    CONTABILIDAD

    DIA  NOMBRE

    1 JUAN

    ADMINISTRACION

    DIA NOMBRE

    15 JOSE

    No se me ocurre como puedo hacer, ya que el SP no lo puedo modificar.

    El codigo de mi control .cs

    public ActionResult Cumpleaños()
            {
                XXX.IntranetClient Servicio = new XXX.IntranetClient();
    
                string mes = DateTime.Now.ToString("MM");
                var vCumpleaños = Servicio.SelectCumpleanios("01", mes);
                List<CumpleaniosEntity> Cumpleanios = new List<CumpleaniosEntity>();
                foreach (var item in vCumpleaños)
                {
                    Cumpleanios.Add(UtilHost.TranslateCumpleaniosToCumpleaniosEntity(item));
                }
               
               ViewData["Cumpleaños"] = Cumpleanios ;
    
                return View();
            }

    El codigo de mi vista

    <tbody>
        <%
            foreach (var Cumpleaños in (List<CumpleaniosEntity>)ViewData["Cumpleaños"])
            {
                Response.Write("<tr>");
                Response.Write("<td>" + Cumpleaños.fecha_nacimiento_dia + "</td>");
                Response.Write("<td>"  + Cumpleaños.nombres + "</td>");
                Response.Write("</tr>");
            }
        %>
        </tbody>

    El filtrado por Area tengo que hacerlo en el control? o en la vista? ayuda!! =(

    miércoles, 6 de marzo de 2013 22:07

Todas las respuestas

  • Lo correcto es que el filtrado lo hagas en el controlador y no en la vista. Es decir, se supone que a la vista le llega el modelo ya cargado con la información que tiene que mostrar, para que en la vista no se realice ninguna operación y todos los cálculos estén centralizados en el controlador permitiendo, por ejemplo, realizar con facilidad las pruebas unitarias.

    Bueno, ¿y cómo puedes filtrar los datos en el controlador si no puedes cambiar el procedimiento almacenado que los suministra? Pues filtrándolos en lado cliente. No será igual de eficiente que filtarlos en el servidor, pero resuelve tu problema si no puedes tocar el servidor:

    var vCumpleaños = Servicio.SelectCumpleanios("01", mes).Where(c=>c.area==areaDeseada);

    Evidentemente, la variable areaDeseada la habrás cargado antes con el valor que quieras filtrar, y "area" es el nombre de la columna que te devuelve el servidor con el dato que filtras.

    Por cierto, pasar estos datos a la vista en el ViewData es una pequeña chapuza; dado que son precisamente los datos fundamentales que se muestran, lo lógico sería pasarlos en el Model:

    return View(Cumpleanios);

    miércoles, 6 de marzo de 2013 22:22
  • Hola Alberto,

    mi SP me lista esta tabla de ejemplo que he hecho:


    Ahora, necesito filtrarlo por area para poder mostrarlo en la vista de la sgte forma:

     seguí tu consejo y realice lo sgte:

    var vCumpleaños = Servicio.SelectCumpleanios("01", mes).Where(c=>c.area=="CONTABILIDAD");

    lo hice asi porque queria saber si esto me devuelve solo los empleados del area de contabilidad pero me devuelve el listado vacio.

    uhmm mi problema es ordenar mi listado por areas para mostrarlo en la vista.

    y no entendi como cargar el area deseada previamente, xq lo que necesito es ordenarlos como dije anteriormente.

    Disculpa si mi pregunta es tonta pero recien estoy empezando.

    Gracias!!!

    jueves, 7 de marzo de 2013 14:30
  • La consulta

    var vCumpleaños = Servicio.SelectCumpleanios("01", mes).Where(c=>c.area=="CONTABILIDAD");

    no debería volver vacía, salvo que se dé el caso de que efectivamente no haya en ("01", mes) ningún registro que tenga area=="CONTABILIDAD". Si estás seguro de que sí que hay registros que cumplen esas dos condiciones, entonces no hay más remedio que tirar de "debugger", seguir la ejecución paso a paso (posiblemente después de introducir una variable intermedia para poder ver los resultados intermedios) e ir comprobando exactamente qué valores hay y qué es lo que pasa con ellos.

    Si quieres mostrar en la vista cuatro "subtablas" como indicas en la imagen, una opción es crear una vista parcial que muestre una tabla, incrustarla cuatro veces en la vista principal, y a cada una de las cuatro copias pasarle el correspondiente subconjunto de registros. Los cuatro subconjuntos los puedes formar a partir del conjunto de registros que te ha devuelto tu SP aplicándole cuatro veces el filtro Where como hicimos en el ejemplo inicial.

    jueves, 7 de marzo de 2013 14:46
  • investigando sobre el tipo de dato de la columna area, descubri que es char con longitud 50, es por eso que me devolvia el listado vacio. 

    Ahora si hago c=>c.area == "CONTABILIDAD                                             "   SI me filtra por esa area.

    En la vista quiero mostrar tantas subtablas como numero de areas que me devuelva el SP.

    El verdadero listado de mi SP me devuelve 92 registros y tengo más de 15 areas.

    uhmm seria conveniente crear datatable para cada filtro de area? o el perfomance de la aplicacion sería muy lento?

    Ayuda!!! =(

    jueves, 7 de marzo de 2013 15:50