none
Filtrar por fechas en una Vista RRS feed

  • Pregunta

  • Hola.

    Antes que nada buen día a todos. Tengo la siguiente situación: Estoy construyendo un sitio web en asp.net mvc 4, ya tengo mi pequeño modelo, mis viewsmodels, y ya hice mi primera vista, en mi controlador hago mi consulta especificando el rango de fechas que quiero mostrar(el año y mes se lo mando como parámetro al controlador(int mes, int anio)), pero a la vista únicamente mando el producto y la suma de sus ventas de pedidos, para lo cual utilizo una función "sum en mi consulta linq".

    Mi problema es que necesito filtrar por fechas en mi vista, pero como comento únicamente mando mi "producto" y las "ventas totales", me sale 2 problemas:

    1.- como filtro en una vista?

    2.- si no estoy mandando fechas a la vista(solo mando un ToList con 2 campos, "Producto" y "Ventas Totales"), puedo hacer esa consulta por rango de fechas? es decir, con 2 campos tipo fecha: Fecha inicial y Fecha final? cuando ejecuto mi vista utilizo la ruta de la vista con los parámetros de fechas(mes y año), estos datos pueden tomarse directamente de la vista como 2 campos tipo fechas? y utilizar estos campos en mi consulta linq para que me mande los datos de las fechas que especifique en mi vista?  :( Espero haberme dado a entender

    Gracias 

    miércoles, 5 de noviembre de 2014 17:00

Todas las respuestas

  • >>1.- como filtro en una vista?

    en la vista no se filtra nada, el fltro lo aplicas en el action

    >>mando como parámetro al controlador(int mes, int anio)),

    al controlador no le envias nada, es al action que esta en el controlador

    o sea

    public class XXController{
    
       [HttpPost]
       public ActionResult XXAction(int mes, int anio){
    
           //aqui filtras
    
           return new View(producto);
    
       }
    
    }

    >>puedo hacer esa consulta por rango de fechas? es decir, con 2 campos tipo fecha: Fecha inicial y Fecha final?

    pero no era que enviabas mes y año ?  de donde sale las fechas de inicio y fin

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 5 de noviembre de 2014 17:43
  • hola, gracias por contestar.

    Disculpa, cierto es al método de acción que mando mes y año, lo tengo así por que no se me ocurrió de otra forma, pero mi base de datos lo que tiene es fecha de pedido, en realidad lo que necesito es filtrar por rango de fechas( fecha de inicio y fecha final), pero lo que busco es que el usuario dé las fechas pero no desde la barra de direcciones del explorador(?mes=1&anio=1980), si no que lo seleccione de 2 campos de tipo fecha y en base a eso mostrar los resultados. Gracias

    Saludos

    miércoles, 5 de noviembre de 2014 17:50
  • >>pero mi base de datos lo que tiene es fecha de pedido,

    podrias usar algun componente como ser

    http://jqueryui.com/datepicker/

    para poner en la view la seleccion de una fecha

    >>en base a eso mostrar los resultados

    pero para mostrar el resultado requieres de un post a un action, por eso puse en el ejemplo de al primer respuesta el [Httppost]

    alli tomas la seleccion del submit y aplcias el filtro para enviar los datos a la view

    o sea se definen dos action uno por GET y otro por POST

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 5 de noviembre de 2014 18:08
  • Prueba esto:

    HomeController:      

            private List<ProductModel> products = new List<ProductModel>();
    
            [HttpGet]
            public ActionResult Index()
            {
                var model = products;
                return View(model);
            }
    
            [HttpPost]
            public ActionResult Index(int Year, int Month)
            {
                var model = from p in products
                            where p.CreatedOn.Year == Year && p.CreatedOn.Month == Month
                            select p;
                return View(model);
            }

    Index.cshtml

    <div>
    @Html.BeginForm("Index", "Home") {
        @Html.TextBox("Year")<br/>
        @Html.TextBox("Month")<br>
        <input type="submit" value="Buscar" />
    }
        </div>
    
            <table>
            <tr>
            <th>
                Id
            </th>
            <th>
                Name
            </th>
            </tr>
            @foreach(var product in Model) 
            {
                <tr>
                    <td>
                        @Html.DisplayFor(p => p.Id);
                   </td>
                <tr>
                    <td>
                        @Html.DisplayFor(p => p.Name);
                    </td>
                </tr>
    
            }
            </table>

    Por defecto cargamos todos los productos en la función Index()

    La vista incluye un formulario con los campos de filtro. Dicho form hace un post a la función Index(int Year, int Month), pasándole automáticamente los valores que introduces en los campos de texto a través del binder automático de MVC.

    Entonces, la función filtra los datos de productos y devuelve el modelo filtrado a esa misma vista, la cual renderiza solo los elementos filtrados.

    Sustituye ProductModel por tu modelo de producto, y la expresión "from" del Controller por una query a tu base de datos o capa de acceso a datos.

    miércoles, 5 de noviembre de 2014 20:14
  • Gracias por contestar Leandro.

    Es necesario utilizar Jquery? Lo puedo hacer de momento con puro código asp.net mvc? y una vez que yo logre entender el ciclo irle metiendo jquery y otros. Gracias

    Saludos

    miércoles, 5 de noviembre de 2014 21:52
  • ahh quieres filtrar pero desde el cliente?

    yo apuntaba a realizar con un post que actualice la pagina, si poder se puede con jquery, podrias enviar una invocacion ajax a un action el cual retorne un json

    pero en este caso seria bueno usar un grid que soporte json por origen de dato como ser jqGrid o Datatable

    entonces cuando siltras envias al action una invocacion con $.ajax y el resultado lo asignas al grid

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 5 de noviembre de 2014 22:48
  • Hola Leandro :( que complicado suena, quizá por que no se de esas tecnologías.

    Como te decía, puedo hacer lo siguiente con puro asp.net mvc?:

    1.- cuando ingrese por primera vez a la vista, que muestre un formulario pidiendo las 2 fechas(fecha inicio, fecha fin) Get

    2.- al darle enviar, que mande esas 2 fechas a método de acción y ahí hacer mi consulta con esas fechas. Post

    3.- enviar resultado de mi consulta con el filtro de las fechas a la misma vista pero que muestre abajo de las fechas(del formulario en paso 1) la información en una tabla.

    Gracias

    Saludos

    jueves, 6 de noviembre de 2014 0:01
  • >>puedo hacer lo siguiente con puro asp.net mvc?

    si seria como el ejemplo que expone sesispla

    pero esto hara un post de la pagina

    tambien podrias evaluar usar el @Ajax.BeginForm() con este usarias hacer pero con partview para que solo se actualice una parte, en este caso solo la tabla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 6 de noviembre de 2014 0:19
  • Hola Leandro gracias, si no había visto lo que escribió sesispa, gracias. Lo haré de esta forma, ya que la verdad de jquery, jason, JavaScript y de Ajax no se nada, aunque después de entender la lógica de trabajar en asp.net mvc seguire con estos. Me queda la duda si con estas 4 tecnologías se hace lo mismo? es decir, para poder hacer mis aplicaciones que validen desde el cliente, que actualicen solo una parte del form, etc puedo aprender una de estas tecnologías? después de aprender asp.net mvc, con que herramienta puedo continuar? Gracias por su gran ayuda. Les agradezco soy muy lindos. :*
    jueves, 6 de noviembre de 2014 2:01
  • Me queda la  duda si con estas 4 tecnologías se hace lo mismo? es decir, para poder hacer mis aplicaciones que validen desde el cliente, que actualicen solo una parte del form, etc puedo aprender una de estas tecnologías?

    En general, la recomendación para cualquier programador que quiera trabajar con MVC es que se haga fuerte en la programación en el lado cliente. Saber .NET en sí no es suficiente.

    jQuery, JSON, JavaScript y AJAX son algunas tecnologías del lado cliente que  debes dominar y suelen aplicarse juntas, ya que por separado no tienen mucho sentido:

    • JavaScript: Lenguaje de programación, generalmente asociado al lado cliente (el navegador web)
    • jQuery: Manipular el DOM. Es una librería JavaScript para cambiar dinámicamente el código HTML
    • JSON: Formato ligero para el intercambio de datos entre el cliente (navegador) y servidor (ASP .NET)
    • AJAX: Tecnología de desarrollo para la programación asíncrona (Asyncronous JavaScript And XML)

    Pero no son las únicas:

    • HTML 5
    • CSS 3, LESS...
    • WebSockets

    Es un camino largo, pero apasionante :)

    Puedes empezar por visitar la Microsoft Virutal Academy y revisar los temas sobre HTML 5:

    http://www.microsoftvirtualacademy.com/training-topics/html5_topic_page_es

    http://www.microsoftvirtualacademy.com/training-courses/introduction-to-asp-net-mvc

    http://www.microsoftvirtualacademy.com/training-courses/developing-universal-windows-apps-with-html-and-javascript-jump-start


    jueves, 6 de noviembre de 2014 15:26