none
Receber o valor de vários checkboxes dinâmicos no controller RRS feed

  • Pergunta

  • Boa Tarde.

      Eu crio dinâmicamente vários checkboxes em um loop...

    ...
    <%= Html.CheckBox("cb"+ i) %>
    ...

    porem não sei como recebe-lo no meu controller. quando o nome é fixo eu posso fazer algo como :

    ...
    MinhaClasse controles = new MinhaClasse();

    controles.UpdateFrom( Request.Form );
    ...

    sendo que os inputbox's tenham o mesmo ID que os atributos na "MinhaClasse".

    Porem os checboxes tem id dinâmicos ("cb1", "cb2", etc...), como receber eles no controller ?

    Vlw pela ajuda!!!
    terça-feira, 29 de dezembro de 2009 17:57

Respostas

  • Fala Mordred,

    Fiz um teste rápido aqui, acho que vai te ajudar:

    No Controller :

            public ActionResult UpdateChecks(IList<int> checks)
            {
                return View(checks);
            }

    Na View :

            <form method="post" action="/Home/UpdateChecks">
                <input type="checkbox" name="checks" value="1" /> Um <br />
                <input type="checkbox" name="checks" value="4" /> Quatro <br />
                <input type="checkbox" name="checks" value="2" /> Dois <br />
                <input type="checkbox" name="checks" value="8" /> Oito <br />
                <input type="submit" />
            </form>

    Coloque o breakpoint no método UpdateChecks e perceba que a variável checks terá uma lista contendo somente os valores dos checkboxes que foram selecionados na View .



    Forte abraço,

    André Borges Medeiros
    MCPD, MCT

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    terça-feira, 29 de dezembro de 2009 20:21
    Moderador
  • Fala Morded,

    O Bind do ASP.NET MVC é bem esperto...
    Você pode "recceber" no Controller todos os campos que estão na sua View . Por exemplo, você poderia fazer assim:

    No Controller :

        public ActionResult UpdateChecksAndValues(string nome, int quantidade, IList<int> checks)
        {
            // Aqui você terá as propriedades preenchidas com os valores do formulário
            return View();
        }

    Na View :

        <form method="post" action="/Home/UpdateChecksAndValues">
            <input type="text" name="nome" /><br />
            <input type="text" name="quantidade" /><br />
           
            <input type="checkbox" name="checks" value="1" /> Um <br />
            <input type="checkbox" name="checks" value="4" /> Quatro <br />
            <input type="checkbox" name="checks" value="2" /> Dois <br />
            <input type="checkbox" name="checks" value="8" /> Oito <br />
            <input type="submit" />
        </form>
           
    Que o método UpdateChecksAndValues vai receber os valores do form numa boa.

    Ou então (que seria a melhor opção, na minha opinião) você poderia criar uma classe e o seu método do Controller poderia receber uma instância dessa classe devidamente "preenchida":

        public class MinhaClasse
        {
            public string Nome { get; set; } // Perceba que os nomes das propriedades "batem" com os nomes dos campos da View
            public int Quantidade { get; set; }
            public IList<int> Checks { get; set; }
        }

    E o Controller ficaria assim:

        public ActionResult UpdateChecksAndValues(MinhaClasse meuObjeto)
        {
            // Aqui você terá o objeto "meuObjeto" preenchido com os valores do formulário "magicamente"
            return View();
        }


    Forte abraço,

    André Borges Medeiros
    MCPD, MCT

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    segunda-feira, 4 de janeiro de 2010 12:32
    Moderador

Todas as Respostas

  • Fala Mordred,

    Fiz um teste rápido aqui, acho que vai te ajudar:

    No Controller :

            public ActionResult UpdateChecks(IList<int> checks)
            {
                return View(checks);
            }

    Na View :

            <form method="post" action="/Home/UpdateChecks">
                <input type="checkbox" name="checks" value="1" /> Um <br />
                <input type="checkbox" name="checks" value="4" /> Quatro <br />
                <input type="checkbox" name="checks" value="2" /> Dois <br />
                <input type="checkbox" name="checks" value="8" /> Oito <br />
                <input type="submit" />
            </form>

    Coloque o breakpoint no método UpdateChecks e perceba que a variável checks terá uma lista contendo somente os valores dos checkboxes que foram selecionados na View .



    Forte abraço,

    André Borges Medeiros
    MCPD, MCT

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    terça-feira, 29 de dezembro de 2009 20:21
    Moderador
  • Opa, Obrigado André!

    Boa solução, porém eu tenho mais que checkboxes na página e preciso reaver  seus valores. Pesquisando descobri que através de um

    foreach (string key in Request.Form)
    {
             if  ( (key.StartsWith("cb") ) || (key.StartsWith("tb") )
                    {
                          valor = Request.Form["" + key];

    ...

    Obtenho o valor de todos eles!!!

    Mas acredito que não seja a melhor forma pois o for varre todos os controles (até os que não foram preenchidos).

    A minha dúvida é, será que não teria como trazer só os preenchidos como no seu exemplo, porem com uma informação adicional dizendo o ID do controle ? (  ex.: cbCasa - 1, tbTipo - "Sobrado" )

    Obrigado pela ajuda !!!
    sexta-feira, 1 de janeiro de 2010 17:53
  • Fala Morded,

    O Bind do ASP.NET MVC é bem esperto...
    Você pode "recceber" no Controller todos os campos que estão na sua View . Por exemplo, você poderia fazer assim:

    No Controller :

        public ActionResult UpdateChecksAndValues(string nome, int quantidade, IList<int> checks)
        {
            // Aqui você terá as propriedades preenchidas com os valores do formulário
            return View();
        }

    Na View :

        <form method="post" action="/Home/UpdateChecksAndValues">
            <input type="text" name="nome" /><br />
            <input type="text" name="quantidade" /><br />
           
            <input type="checkbox" name="checks" value="1" /> Um <br />
            <input type="checkbox" name="checks" value="4" /> Quatro <br />
            <input type="checkbox" name="checks" value="2" /> Dois <br />
            <input type="checkbox" name="checks" value="8" /> Oito <br />
            <input type="submit" />
        </form>
           
    Que o método UpdateChecksAndValues vai receber os valores do form numa boa.

    Ou então (que seria a melhor opção, na minha opinião) você poderia criar uma classe e o seu método do Controller poderia receber uma instância dessa classe devidamente "preenchida":

        public class MinhaClasse
        {
            public string Nome { get; set; } // Perceba que os nomes das propriedades "batem" com os nomes dos campos da View
            public int Quantidade { get; set; }
            public IList<int> Checks { get; set; }
        }

    E o Controller ficaria assim:

        public ActionResult UpdateChecksAndValues(MinhaClasse meuObjeto)
        {
            // Aqui você terá o objeto "meuObjeto" preenchido com os valores do formulário "magicamente"
            return View();
        }


    Forte abraço,

    André Borges Medeiros
    MCPD, MCT

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    segunda-feira, 4 de janeiro de 2010 12:32
    Moderador
  • Hehe...

    brigado pela aula velhinho!!! funcionou que é uma beleza... A dica da classe como parâmetro é muito boa!!!

    Obrigado pela ajuda!

    []`s
    segunda-feira, 4 de janeiro de 2010 23:18