none
Comparação DateTime(month) com DropDownList RRS feed

  • Pergunta

  • Buenas, 

    Estou tentando criar uma view que liste os aniversariantes do mês e quero usar um DropDownList para selecionar o mês no qual aparecerá na View. Para isso preciso comparar o mês da data de nascimento(DateTime DataNascimento) com o valor obtido pelo DropDownList.

    Classe:

     public class Membro
        {
            [Key]
            public int MembroId { get; set; }
    
            [StringLength(5, ErrorMessage = "Máximo 5 caracteres.")]
            [RegularExpression(@"^\d+$", ErrorMessage = "Campo aceita somente números.")]
            public string NumCartao { get; set; }
    
            public bool Ativo { get; set; }
    
            [Required(ErrorMessage = "Campo obrigatório.")]
            public string Nome { get; set; }
    
            [RegularExpression(@"(^(\d{2}\x2E\d{3}\x2E\d{3}[-]\d{1})$|^(\d{2}\x2E\d{3}\x2E\d{3})$)", ErrorMessage = "(11.111.111-1 ou 11.111.111)")]
            public string RG { get; set; }
    
            [RegularExpression(@"(^\d{3}\x2E\d{3}\x2E\d{3}\x2D\d{2}$)", ErrorMessage = "(111.111.111-11)")]
            public string CPF { get; set; }
    
            [DisplayName("Data Nascimento")]
            [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
            public DateTime DataNascimento { get; set; }
    
            [Required(ErrorMessage = "Seleção obrigatória.")]
            public int PastaId { get; set; }
    
            public virtual Pasta Pasta { get; set; }
        }
    }

    Controller:

     public ActionResult NiverMes()
            {
                Membro membro = db.Membros.Where(m => m.DataNascimento.Month == dropDownValue);
                  return View(membros);
            }
            

    View:

    @model IEnumerable<Teste.Models.Membro>
    
    
    @{
        ViewBag.Title = "Aniversariantes do mês";
    }
    
    <h3 class="CorPadrao" align="center">Aniversariante do mês</h3>
    </br>
    
    <table class="GridView">
        <tr class="HeaderStyle">
            <th>
                @Html.DisplayNameFor(model => model.Nome)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.DataNascimento)
            </th>
        </tr>
        @{int count = 0;}
        @foreach (var item in Model)
        {
            @Html.HiddenFor(modelItem => item.PastaId)
            if (count % 2 == 0)
            {
                string strUl = "<tr class='RowStyle'>";   
            @Html.DisplayTextFor(model => strUl)
            }
            else
            {
                string strUl = "<tr class='AlternatingRowStyle'>";   
            @Html.DisplayTextFor(model => strUl)
            }
            <td>
                @Html.DisplayFor(model => item.Nome)
            </td>
            <td>
                @Html.DisplayFor(model => item.DataNascimento)
            </td>
            
            string strtr = "</tr>";   
            @Html.DisplayTextFor(model => strtr)
            
            count++;
        }
    </table>
    
    <h3 class="CorPadrao">Selecione o mês para listar os aniversariantes.</h3>
    </br>
    
    <text class="CorPadrao">Selecione o mês:</text>
    <select class="" id="Mes" name="Mes">
        <option value="0">Todos</option>
        <option value="1">Janeiro</option>
        <option value="2">Fevereiro</option>
        <option value="3">Março</option>
        <option value="4">Abril</option>
        <option value="5">Maio</option>
        <option value="6">Junho</option>
        <option value="7">Julho</option>
        <option value="8">Agosto</option>
        <option value="9">Setembro</option>
        <option value="10">Outubro</option>
        <option value="11">Novembro</option>
        <option value="12">Dezembro</option>
    </select>

    O problema que estou enfrentando é que eu não consigo pegar o valor obtido pelo DropDownList para fazer a comparação e obter os aniversariantes de acordo com o mês selecionado.

    Gostaria de saber se estou no caminho certo ou se existe uma forma mais adequada.

    Desde já agradeço.


    terça-feira, 4 de junho de 2013 18:34

Todas as Respostas

  • Magalhas,
    boa tarde,

    pode utilizar jquery para carregar com ajax sua listagem... 


     
           $(document).ready(function () {
                $('select[id="Mes"]').change(function () {
                    var idMes = parseInt($(this).val());
                  
                    $.ajax(@Html.Action("NiverMes","Route"), data : { mes : idMes });
                });
            });
    



    Altere sua action para receber o mes por parâmetro:

    public ActionResult NiverMes(int mes)



    Att.,

    Wanderson de Paula

    • Sugerido como Resposta Paulo M Dalbosco terça-feira, 4 de junho de 2013 19:33
    terça-feira, 4 de junho de 2013 19:09
  • Boa tarde Wanderson,

    desde já agradeço a disponibilidade!

    Bom eu andei verificando no meu código e alterei o seguinte:

    public ActionResult NiverMes()
            {
                var membros = db.Membros.Include(m => m.Pasta);
                return View(membros.ToList().Where(o => o.DataNascimento.Month == 2));
            }

    No caso acredito que a comparação em questão está correta, porém só preciso obter o valor do dropdownlist.

    Você citou usar o jquery com ajax para listar...desculpe mas não tenho muito conhecimento em jquery e ajax, tentei o código que você postou, atribui no final da minha view, mantendo o dropdown, porém não obtive sucesso. Queria entender melhor como atribuo o value do dropdown para poder comparar no Controller usando a forma que você citou.

    Thanks!

    terça-feira, 4 de junho de 2013 21:00
  • Ok,

    Acontece que no MVC você não acessa o componente diretamente, como no Code Behind de uma aplicação WebForm. Você deve passar o valor por parâmetro ("NiverMes(int mes)" mes do exemplo que citei acima). O jquery acima também já é o suficiente para chamar a action. 

    Veja mais sobre jquery ajax aqui:

    api.jquery.com/jQuery.ajax/

    Att.,


    Wanderson de Paula

    terça-feira, 4 de junho de 2013 21:08
  • Ok Wanderson, 

    Se eu entendi certo a jquery/ajax vai obter o valor selecionado no dropdownlist e a action NiverMes(int mes) vai obter o valor para cumprir a condição.

    No caso minha view e controle ficaram assim:

    <text class="CorPadrao">Selecione o mês:</text>
    <select class="" id="Mes" name="Mes">
        <option value="0">Todos</option>
        <option value="1">Janeiro</option>
        <option value="2">Fevereiro</option>
        <option value="3">Março</option>
        <option value="4">Abril</option>
        <option value="5">Maio</option>
        <option value="6">Junho</option>
        <option value="7">Julho</option>
        <option value="8">Agosto</option>
        <option value="9">Setembro</option>
        <option value="10">Outubro</option>
        <option value="11">Novembro</option>
        <option value="12">Dezembro</option>
    </select>
    
    $(document).ready(function () {
                $('select[id="Mes"]').change(function () {
                    var idMes = parseInt($(this).val());
                  
                    $.ajax(@Html.Action("NiverMes", "Route"), data : { mes : idMes });
                });
            });


    e o controle assim:

    public ActionResult NiverMes(int mes)
            {
                var membros = db.Membros.Include(m => m.Pasta);
                return View(membros.ToList().Where(o => o.DataNascimento.Month == mes));
            }

    Por não entender muito sobre jquery/ajax, gostaria de saber se é necessário importar algo pra funcionar ou se apliquei errado, pois estou obtendo o seguinte erro:

    O dicionário de parâmetros contém uma entrada nula para o parâmetro 'mes' de tipo que não permite valor anulável 'System.Int32' para o método 'System.Web.Mvc.ActionResult NiverMes(Int32)' em 'Teste.Controllers.MembroController'. Um parâmetro opcional deve ser um tipo de referência, um tipo que permite valor anulável ou declarado como opcional.
    Parameter name: parameters

    Se puder me ajudar eu agradeço!!!

    quarta-feira, 5 de junho de 2013 12:13
  • Quase isso,

    Você precisa incluir a biblioteca jquery, pode fazer o download aqui e incluir no projeto:

    download:

    http://jquery.com/download/

    inclusão na sua página:

    	<script src="jQuery-versão.js"></script>
    

    ou referenciar a do google, só adicionando isso no head da sua página:

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>

    e seu script deve ficar entre tags <script></script>, assim:

    <script>
    
    $(document).ready(function () {
                $('select[id="Mes"]').change(function () {
                    var idMes = parseInt($(this).val());
                  
                    $.ajax(@Html.Action("NiverMes", "Route"), data : { mes : idMes });
                });
            });
    
    </script>

    Att.,


    Wanderson de Paula

    quarta-feira, 5 de junho de 2013 12:22
  • Wanderson,

    Deu certo parcialmente, alterei as informações como você citou e gerou outro erro. Ao debugar o codigo e ao consultar o erro, o programa está em loop, criei uma condição na minha ActionResult pra ver se solucionava, mas não adiantou!!

    Veja como ficou.

    View:

    @model IEnumerable<Teste.Models.Membro>
    
    <script src="jQuery-1.7.1.js"></script>
    
    @{
        ViewBag.Title = "Aniversariantes do mês";
    }
    
    <h3 class="CorPadrao" align="center">Aniversariante do mês</h3>
    </br>
    
    <table class="GridView">
        <tr class="HeaderStyle">
            <th>
                @Html.DisplayNameFor(model => model.Nome)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.DataNascimento)
            </th>
        </tr>
        @{int count = 0;}
        @foreach (var item in Model)
        {
            @Html.HiddenFor(modelItem => item.PastaId)
            if (count % 2 == 0)
            {
                string strUl = "<tr class='RowStyle'>";   
            @Html.DisplayTextFor(model => strUl)
            }
            else
            {
                string strUl = "<tr class='AlternatingRowStyle'>";   
            @Html.DisplayTextFor(model => strUl)
            }
            <td>
                @Html.DisplayFor(model => item.Nome)
            </td>
            <td>
                @Html.DisplayFor(model => item.DataNascimento)
            </td>
            
            string strtr = "</tr>";   
            @Html.DisplayTextFor(model => strtr)
            
            count++;
        }
    </table>
    
    <text class="CorPadrao">Selecione o mês:</text>
    <select class="" id="Mes" name="Mes">
        <option value="0">Todos</option>
        <option value="1">Janeiro</option>
        <option value="2">Fevereiro</option>
        <option value="3">Março</option>
        <option value="4">Abril</option>
        <option value="5">Maio</option>
        <option value="6">Junho</option>
        <option value="7">Julho</option>
        <option value="8">Agosto</option>
        <option value="9">Setembro</option>
        <option value="10">Outubro</option>
        <option value="11">Novembro</option>
        <option value="12">Dezembro</option>
    </select>
    
    <script>
        $(document).ready(function () {
            $('select[id="Mes"]').change(function () {
                var idMes = parseInt($(this).val());
    
                $.ajax(@Html.Action("NiverMes", "Membro")), data; { mes: idMes };
            });
        });
    </script>

    Controller:

            public ActionResult NiverMes(int mes = 0)
            {
                var membros = db.Membros.Include(m => m.Pasta);
                if (mes != 0)
                {
                    return View(membros.ToList().Where(o => o.DataNascimento.Month == mes));
                }
                else
                {
                    return View(membros.ToList());
                }
            }

    Observação: Ao debugar não chega a mostrar o dropdownlist para eu selecionar a opção desejada, e o parametro (int mes) está sempre com o valor 0.

    Pelo fato de estar listando junto com o dropdownlist, pensei em talves criar uma partial view, com o dropdownlist e ao selecionar o mes, direcionar para listar os aniversariantes com o mes selecionado. Não sei se isso seria a solução, mas até o momento segue o erro obtido:

    Server Error in '/' Application.

    Insufficient stack to continue executing the program safely. This can happen from having too many functions on the call stack or function on the stack using too much stack space.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.InsufficientExecutionStackException: Insufficient stack to continue executing the program safely. This can happen from having too many functions on the call stack or function on the stack using too much stack space.

    Source Error: 
    Line 69:             var idMes = parseInt($(this).val());
    Line 70: 
    Line 71:             $.ajax(@Html.Action("NiverMes", "Membro")), data; { mes: idMes };
    Line 72:         });
    Line 73:     });


    Tem alguma ideia do q possa ser??

    Obrigado.



    quarta-feira, 5 de junho de 2013 13:07
  • A princípio, 

    o trecho da chamada ajax data : { mes : idMes }, é dois pontos mesmo.

    Att.,


    Wanderson de Paula

    quarta-feira, 5 de junho de 2013 13:33
  • Então, eu coloquei com dois pontos e tava dando erro, vou verificar!
    quarta-feira, 5 de junho de 2013 13:38
  • Wanderson alterei dessa forma como vc citou, apesar de existir marcação de erro no dois pontos e quando coloco o cursor do mouse aparece "Expected ;"...não sei se tem a ver mas esta dessa forma:

    $.ajax(@Html.Action("NiverMes", "Membro"), data : { mes: idMes });

    Porém o erro continua o mesmo!

    Parece que o erro está nesta linha, mesmo debugando não consigo descobrir!!

    Existe alguma forma de debugar o trecho jquery/ajax pra ver se está obtendo valor de alguma forma??

    Ou se tiver alguma outra sugestao eu tento mudar!!


    quarta-feira, 5 de junho de 2013 13:54
  • Experimente fazer da seguinte forma: 

        $.ajax({
            type: 'GET',
            url: '/Membro/NiverMes',
            data: { mes: idMes }
        });

    Att.,


    Wanderson de Paula

    quarta-feira, 5 de junho de 2013 14:21
  • Boa tarde Wanderson,

    Fiz a alteração citada anteriormente e não obtive o erro, porém acredito q a variavel NiverMes(int mes), nao está recebendo o value do mes,
    pois tive q inicializar com 0... NiverMes(int mes = 0). Com isso, eu sempre obtenho 0 na variavel mes.

    segue Controller atual:

    public ActionResult NiverMes(int mes = 0)
            {
                var membros = db.Membros.Include(m => m.Pasta);
                if (mes != 0)
                {
                    return View(membros.ToList().Where(o => o.DataNascimento.Month == mes));
                }
                else
                {
                    return View(membros.ToList());
                }
            }



    Fazendo dessa forma eu ja obtenho o value por exemplo se eu selecionar Fevereiro o value será 2 e cumprira a condição, para isto nao seria necessario
    talves um botao submit para o controller receber esse value?

    Thanks.

    quarta-feira, 5 de junho de 2013 18:47
  • Use console.log para "debugar" o código javascript:

    var idMes = parseInt($(this).val());
    console.log(idMes);

    o valor da variável será exibido no console do browser (tecla F12 e aba console, exiba depois execute a página e ação).

    E com o $.ajax não será necessário o submit mesmo.

    Att.,



    Wanderson de Paula

    quarta-feira, 5 de junho de 2013 19:14