none
Como filtrar datos en mvc y que me muestre un mensaje RRS feed

  • Pregunta

  • Hola saludos a todos desde Chile.Mi consulta es la siguiente:

    Estoy realizando un proyecto para un gimnasio, cuando ingreso a la vista Index, por defecto me muestra todos los socios del gimnasio, a la vez le puse 2 textbox para filtrar por N°socio y Rut de socio, todo bien hasta el momento, pero lo que me falta es que cuando yo busque a un socio me mande un mensaje indicando que el plan del socio ha caducado(esto se realiza leyendo la fecha de vencimiento del plan y comparandola con la fecha actual), el asunto es que no me filtra.Me he estado calentando la cabeza como hacerlo, ah y lo estoy haciendo con csharp, usando linq para acceder a la base de datos.Les muesto mi codigo

    Modelo

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    namespace Sistema.Models
    {
        public class Socio
        {
            [Key]
            public int SocioID { get; set; }

            [Required(ErrorMessage = "Debe ingresar el Rut")]
            public string Rut_Socio { get; set; }

            [StringLength(50, MinimumLength = 1, ErrorMessage = "No puede ingresar más de 50 caracteres")]
            [Required(ErrorMessage = "Debe ingresar el Nombre")]
            public string Nombre_Socio { get; set; }

            [Required(ErrorMessage = "Debe seleccionar el Sexo")]
            public string Sexo { get; set; }

            [Required(ErrorMessage = "Debe ingresar la Dirección")]
            public string Direccion { get; set; }

            [DataType(DataType.EmailAddress)]
            [Required(ErrorMessage = "Debe ingresar el Correo")]
            public string Correo { get; set; }

            [Required(ErrorMessage = "Debe ingresar el Teléfono")]
            public int Telefono { get; set; }

            [Required(ErrorMessage = "Debe seleccionar un Tipo de plan")]
            public string Tipo_Plan { get; set; }

            [DataType(DataType.Date)]
            [Display(Name = "Fecha de vencimiento")]
            [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
            [Required(ErrorMessage = "Debe seleccionar la fecha")]
            public DateTime Fecha_Vencimiento { get; set; }

            public virtual ICollection<Casillero> Casilleros { get; set; }
            public virtual ICollection<Contrato> Contratos { get; set; }
            public virtual ICollection<Socio> Socios { get; set; }
        }
    }

    Vista

    @model IEnumerable<Sistema.Models.Socio>
    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
        WebGrid grid = new WebGrid(Model, rowsPerPage: 7);
    }

    <h3>Ver socios</h3>

    <form class="form-inline" role="form" style="height:50px;">
        @using (Html.BeginForm()){       
      <div class="form-group">
        <label class="sr-only" for="N_Socio">N Socio</label>
      <input type="text" class="form-control input-sm" id="N_Socio" name="N_Socio" placeholder="Buscar por N°socio">
      </div>
      <div class="form-group">
        <label class="sr-only" for="Rut_socio">Rut Socio</label>
        <input type="text" id="Rut_socio" name="Rut_socio" class="form-control input-sm" placeholder="Buscar por Rut">
      </div>
     
      <button type="submit" class="btn btn-default btn-xs">Buscar</button>
        }
    </form>
    <div>
     @ViewBag.Message   //Aquí es donde muestro el mensaje
    </div>

    @grid.GetHtml(
            fillEmptyRows: false,
            tableStyle: "table table-striped table-hover",
            mode: WebGridPagerModes.All,
            firstText: "<< Primera",
            previousText: "< Anterior",
            nextText: "Siguiente >",
            lastText: "Última >>",
    columns: new[] {
        grid.Column("SocioID",
        header: "N°Socio"),
        grid.Column("Rut_Socio",
        header: "Rut"),
        grid.Column("Nombre_Socio",
        header: "Nombre"),
        grid.Column("Direccion",
        header: "Dirección"),
        grid.Column("Correo",
        header: "Email",
        format: @<a href="mailto:@item.Correo">@item.Correo</a>
        ),
        grid.Column("Telefono",
        header: "Teléfono"),
        grid.Column("Tipo_Plan",
        header: "Tipo de plan"),
        grid.Column("Fecha_Vencimiento",
        header: "Fecha término de plan",
        format: @<text>@item.Fecha_Vencimiento.ToString("dd-MMMM-yyyy")</text>),
        grid.Column(
              "",
              header: "Acción",
              format: @<text>
                        @Html.ActionLink("Actualizar", "Actualizar", new { id = item.SocioID })
                      </text>
        )
    })

    Controlador

    public class SocioController : Controller
        {
            private UserContext db = new UserContext();

            // GET: /Socio/
            [Authorize(Roles = "Administrador,Recepcionista")]
            public ActionResult Index(int? N_Socio, string Rut_socio)
            {

                 //Aqui filtro los datos para que me filtre por la fecha y me envie un mensaje por ViewBag.Mesagge
                if (N_Socio != null)
                {
                    var vencido = from x in db.Socios
                                  where x.SocioID == N_Socio
                                  && x.Fecha_Vencimiento < DateTime.Now
                                  select x;
                    if (vencido != null)
                    {
                        ViewBag.Message = "Socio con plan vencido debe renovarlo";
                    }
                    ViewBag.Message = "Socio con plan al día";
                }
            //Aqui llamo a todos los socios
                var sociostodos = from s in db.Socios
                                  select s;

                //Aqui filtro a los socios por n°socio

                if (N_Socio != null)
                {
                    var socios = from s in db.Socios
                                 where s.SocioID == N_Socio
                                 select s;
                    return View(socios);
                }

                //Aqui filtro a los socios por rut

                if (!String.IsNullOrEmpty(Rut_socio))
                {
                    sociostodos = sociostodos.Where(s => s.Rut_Socio == Rut_socio);
                    return View(sociostodos);
                }
                return View(db.Socios.ToList());

            }
    }


    Juan Lobos

    domingo, 29 de diciembre de 2013 18:08

Respuestas

  • Gracias a todos ya lo pude resolver.Efectivamente estaba mal la consulta por linq.Les muestro el codigo

     // GET: /Socio/
            [Authorize(Roles = "Administrador,Recepcionista")]
            public ActionResult Index(int? N_Socio, string Rut_socio)
            {
                //Aqui filtro los datos para que me filtre por la fecha y me envie un mensaje por ViewBag.Mesagge
                if (N_Socio.HasValue)
                {
                    var vencido = db.Socios.SingleOrDefault(u => u.SocioID == N_Socio);
                    var total = vencido.Fecha_Vencimiento;
                                    
                    if (vencido != null && total >DateTime.Now)
                    {
                        ViewBag.Message = "Socio con plan al día";
                    }
                    else
                    {
                        ViewBag.Message = "Socio debe renovar el plan";
                    }
                }
                //Aquí lo hago por el rut
                if (!String.IsNullOrEmpty(Rut_socio))
                {
                    var vencidofecha = db.Socios.SingleOrDefault(u => u.Rut_Socio == Rut_socio);
                    var totalvencido = vencidofecha.Fecha_Vencimiento;

                    if (vencidofecha != null && totalvencido > DateTime.Now)
                    {
                        ViewBag.Message = "Socio con plan al día";
                    }
                    else
                    {
                        ViewBag.Message = "Socio debe renovar el plan";
                    }
                }

                var sociostodos = from s in db.Socios
                                  select s;
                if (N_Socio.HasValue)
                {
                    var socios = from s in db.Socios
                                 where s.SocioID == N_Socio.Value
                                 select s;
                    return View(socios);
                }
                if (!String.IsNullOrEmpty(Rut_socio))
                {
                    sociostodos = sociostodos.Where(s => s.Rut_Socio == Rut_socio);
                    return View(sociostodos);
                }
                return View(db.Socios.ToList());

            }

    Ahora si filtra bien y me envia el mensaje correpondiente a la situación del socio.

    Bueno la verdad me puse un poco ambicioso, pero les pregunto.¿Como puedo hacer que en vez de usar el ViewBag pueda hacer que me salga una ventana con el mensaje correspondiente.Gracias a todos los que me respondieron y que tengan un Feliz año.


    Juan Lobos

    • Marcado como respuesta jhon1121 martes, 31 de diciembre de 2013 13:16
    martes, 31 de diciembre de 2013 13:12

Todas las respuestas

  • Si alguien pudiera ayudarme lo agradecería

    Juan Lobos

    domingo, 29 de diciembre de 2013 18:10
  • // GET: /Socio/
             [Authorize(Roles = "Administrador,Recepcionista")]
             public ActionResult Index(int? N_Socio, string Rut_socio)
             {
    
                 //Aqui filtro los datos para que me filtre por la fecha y me envie un mensaje por ViewBag.Mesagge
                 if (N_Socio.HasValue)
                 {
                     var vencido = from x in db.Socios
                                   where x.SocioID == N_Socio.Value
                                   && x.Fecha_Vencimiento < DateTime.Now
                                   select x;
                     if (vencido != null)
                     {
                         ViewBag.Message = "Socio con plan vencido debe renovarlo";
                     }
                     ViewBag.Message = "Socio con plan al día";
                 }
             //Aqui llamo a todos los socios
                 var sociostodos = from s in db.Socios
                                   select s;
    
                //Aqui filtro a los socios por n°socio
    
                if (N_Socio.HasValue)
                 {
                     var socios = from s in db.Socios
                                  where s.SocioID == N_Socio.Value
                                  select s;
                     return View(socios);
                 }
    
                //Aqui filtro a los socios por rut
    
                if (!String.IsNullOrEmpty(Rut_socio))
                 {
                     sociostodos = sociostodos.Where(s => s.Rut_Socio == Rut_socio);
                     return View(sociostodos);
                 }
                 return View(db.Socios.ToList());
    
             }
    

    Tu parámetro es un int? O sea un nullable. Luego tendrías que hacer lo siguiente... Usar .HasValue para saber si tenemos un valor en el paramtero de numero de socio y usar .Value para recuperar el valor.

     


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    domingo, 29 de diciembre de 2013 20:20
    Moderador
  • tengo unas dudas, cuando defines la linea

    <form class="form-inline" role="form" style="height:50px;">

    porque no lo haces con el

    @using(Html.BeginForm("Index", FormMethod.Post)){

    }

    porque no usas los Helpers de asp.net mvc para deifnir los controles

    es mas ese Index que defines porque no lo marcas como [HttpPost] porque deberias definir un Index sin parametros

    Nota. podrias marcarlo como get pero creo que deberias definir dos action, uno sin atributos y otro como post para recibir los valores de los textbox en el submit del form

    analiza como lo realizo aqui

    [ASP.NET MVC] Carga DropDownList dependientes

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    lunes, 30 de diciembre de 2013 1:54
  • Gracias Sergio ,estve aplicando el codigo que me mandaste en el proyecto, pero todavía no filtra.Si miran la imagen que les envío la socia por la cual filtro tiene la fecha de término de plan vencido, deberia decirme socio con plan vencido pero sin embargo me sale el mensaje Socio con plan al día y el mensaje se repite con todos los socios tengan la fecha de termino de plan la que sea.

    Gracias por contestar.


    Juan Lobos

    lunes, 30 de diciembre de 2013 13:40
  • Gracias Leandro por contestar, te respondo a la primera pregunta, de porque no ocupaba los helpers de mvc, era porque intente hacer algo parecido como tu dices, me refiero a usar los helpers claro sin el metodo post como decías y se me desordenaban los textbox, quedaban desordenados en la pagina, me preguntaba porque era y estuve bastante rato calentandome la cabeza, hasta que en vez de codigo Razor ocupe mejor el codigo propiamente html y con ello no se me desordenaba los textbox.

    Y respecto a lo segundo lo hacia sin metodo post, ya que segui el manual que esta en la pagina de asp net mvc cuando le agrego busqueda search y no mencionaba aquello, de hecho me filtra bien ya sea por el rut o el n° de socio, el problema esta en que como decia en mi primer post, cuando yo filtro a un socio quiero que de acuerdo a la fecha me muestre un mensaje si tiene el plan vencido o lo tiene al día.

    Vere como puedo aplicar lo que tu dices en el link que me mandaste al proyecto, gracias reitero por contestar, la verdad es que soy un novato en esto de mvc, pero he aprendido mucho este tiempo y espero seguir aprendiendo.


    Juan Lobos

    lunes, 30 de diciembre de 2013 13:56
  • Cambia esto

    if (vencido != null)
                     {
                         ViewBag.Message = "Socio con plan vencido debe renovarlo";
                     }
                     ViewBag.Message = "Socio con plan al día";
    

    por lo siguiente...

    if (vencido != null)
                     {
                         ViewBag.Message = "Socio con plan vencido debe renovarlo";
                     }
    else{
                     ViewBag.Message = "Socio con plan al día";
    }
    aplica el else al,if

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    lunes, 30 de diciembre de 2013 16:31
    Moderador
  • Gracias Sergio, pero hasta el momento no funciona, me sale cada vez que filtro un socio el siguiente mensaje:

    Socio con plan vencido da lo mismo que el socio tenga la fecha al día.Me preguntaba si mi consulta linq esta errada aunque la reviso y no le veo falla, pero alguien quizas mas experto vea fallas que yo no veo.

    Gracias si por contestar.


    Juan Lobos

    lunes, 30 de diciembre de 2013 19:34
  • Sergio creo que ya se cual podria ser la falla

     if (N_Socio.HasValue)
                 {
                     var vencido = from x in db.Socios
                                   where x.SocioID == N_Socio.Value
                                   && x.Fecha_Vencimiento < DateTime.Now
                                   select x;
                     if (vencido != null)
                     {
                         ViewBag.Message = "Socio con plan vencido debe renovarlo";
                     }
                     ViewBag.Message = "Socio con plan al día";
                 }

    resulta que la Fecha_Vencimiento no traigo los datos por lo que no existe al reves de N_Socio o el Rut, como tendria que ser la consulta con linq para que al traer los datos del socio(filtrarlo con el N_Socio) me traiga los datos de Fecha_Vencimiento y me los compare con Data.Time.Now,Si logro resolverlos les aviso.De antemano gracias


    Juan Lobos

    lunes, 30 de diciembre de 2013 19:43
  • hola

    para que linq reconozca la fecha deberias usar

    SqlFunction.GetDate

    las SqlFunction tienen conversion de linq a sql para poder ejecutar la consulta

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 31 de diciembre de 2013 4:54
  • Gracias a todos ya lo pude resolver.Efectivamente estaba mal la consulta por linq.Les muestro el codigo

     // GET: /Socio/
            [Authorize(Roles = "Administrador,Recepcionista")]
            public ActionResult Index(int? N_Socio, string Rut_socio)
            {
                //Aqui filtro los datos para que me filtre por la fecha y me envie un mensaje por ViewBag.Mesagge
                if (N_Socio.HasValue)
                {
                    var vencido = db.Socios.SingleOrDefault(u => u.SocioID == N_Socio);
                    var total = vencido.Fecha_Vencimiento;
                                    
                    if (vencido != null && total >DateTime.Now)
                    {
                        ViewBag.Message = "Socio con plan al día";
                    }
                    else
                    {
                        ViewBag.Message = "Socio debe renovar el plan";
                    }
                }
                //Aquí lo hago por el rut
                if (!String.IsNullOrEmpty(Rut_socio))
                {
                    var vencidofecha = db.Socios.SingleOrDefault(u => u.Rut_Socio == Rut_socio);
                    var totalvencido = vencidofecha.Fecha_Vencimiento;

                    if (vencidofecha != null && totalvencido > DateTime.Now)
                    {
                        ViewBag.Message = "Socio con plan al día";
                    }
                    else
                    {
                        ViewBag.Message = "Socio debe renovar el plan";
                    }
                }

                var sociostodos = from s in db.Socios
                                  select s;
                if (N_Socio.HasValue)
                {
                    var socios = from s in db.Socios
                                 where s.SocioID == N_Socio.Value
                                 select s;
                    return View(socios);
                }
                if (!String.IsNullOrEmpty(Rut_socio))
                {
                    sociostodos = sociostodos.Where(s => s.Rut_Socio == Rut_socio);
                    return View(sociostodos);
                }
                return View(db.Socios.ToList());

            }

    Ahora si filtra bien y me envia el mensaje correpondiente a la situación del socio.

    Bueno la verdad me puse un poco ambicioso, pero les pregunto.¿Como puedo hacer que en vez de usar el ViewBag pueda hacer que me salga una ventana con el mensaje correspondiente.Gracias a todos los que me respondieron y que tengan un Feliz año.


    Juan Lobos

    • Marcado como respuesta jhon1121 martes, 31 de diciembre de 2013 13:16
    martes, 31 de diciembre de 2013 13:12