Usuario
Filtrar por fechas en una Vista

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
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 -
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
-
>>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 -
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.
-
-
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 -
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
-
>>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 -
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. :*
-
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