Post in a list with checkbox

2

I'm creating an application where the user can select a variety of products through checkbox . But when I click on "Buy" the list goes empty. Can anyone help me with this?

This code is the View:

<tbody>
 @foreach (var servico in Model.Servicos)
 {
<tr>
    <td>
        @servico.Descricao_Servico
    </td>
<td>
    @servico.Valor_Servico
</td>
    <td>
        <label class="checkbox inline">
        <input type="checkbox"  id="@servico.Id" />
        </label>
    </td>
</tr>  
 }
</tbody>

This next is the controller

public ActionResult Cadastrar()
{
    var modelo = ModeloCadastrar();
    return View(modelo);
}

private CadastrarAgendamentoViewModel ModeloCadastrar()
{
    var modelo = new CadastrarAgendamentoViewModel();

    var ddlListaDeFuncionarios = _contexto.Funcionarios.ToList();
    var ddlListaDeServicos = _contexto.Servicos.ToList();
    var ddlProdutos = _contexto.Produtos.ToList();

    modelo.ListaDeFuncionarios = (from funcionarios in ddlListaDeFuncionarios
                                  select new SelectListItem
                                  {
                                      Text = funcionarios.Nome_Usuario,
                                      Value = funcionarios.Id.ToString(),
                                  }).ToList();


    modelo.ListaDeProdutos = (from produtos in ddlProdutos
                              select new SelectListItem
                              {
                                  Text = produtos.Descricao_Produto,
                                  Value = produtos.Id.ToString(),
                              }).ToList();
    modelo.Servicos = ddlListaDeServicos;

    modelo.Data_Agendamento = System.DateTime.Now;
    modelo.Hora_Agendamento = "08:00";
    return modelo;
}
    
asked by anonymous 27.05.2014 / 02:23

3 answers

1

The first problem is the lack of the name attribute in input . Without an name the input is not posted.

Your checkbox should be done as follows:

 
<input type="checkbox" id="@servico.Id" name="Servicos" value="@servico.Id" />

This should resolve the post already. Also, if you expect to receive in controller a service array, do the following:

 
<tbody>
 @{
     var i = 0;
 }
 @foreach (var servico in Model.Servicos)
 {
<tr>
    <td>
        @servico.Descricao_Servico
    </td>
<td>
    @servico.Valor_Servico
</td>
    <td>
        <label class="checkbox inline">
            <input type="checkbox"  id="@servico.Id" name='@string.format("Servicos[{0}]", i)' value="@servico.Id" />
        </label>
    </td>
</tr>
  @{i++;}
 }
</tbody>

In this way your post will send an array of checkboxes with values and ModelBinder of Mvc will be able to create your object, or you can fetch the values by formcollection .

    
27.05.2014 / 13:56
1

Example: FormCollection

View:

@{
    ViewBag.Title = "Lista";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm()) { 
    <h2>Lista</h2>
    <div>
        <label for="Produto1">Produto 1</label>
        <input type="checkbox" id="Produto1" name="Produto" value="1">
    </div>
    <div>
        <label for="Produto2">Produto 2</label>
        <input type="checkbox" id="Produto2" name="Produto" value="2">
    </div>
    <div>
        <label for="Produto3">Produto 3</label>
        <input type="checkbox" id="Produto3" name="Produto" value="3">
    </div>
    <div>
        <label for="Produto4">Produto 4</label>
        <input type="checkbox" id="Produto4" name="Produto" value="4">
    </div>
    <div>
        <button type="submit">Enviar</button>
    </div>
}

Action:

[HttpGet]
public ActionResult Lista()
{
    return View();
}

[HttpPost]
public ActionResult Lista(FormCollection form)
{    
    System.Collections.IEnumerable Produto = form["Produto"];
    return RedirectToAction("Lista");
}

Page generated - Html

WhenIclickonthebuttonSubmitsend

Now everything will depend on your model and rule of your application

    
27.05.2014 / 03:48
0

Unfortunately it did not work for me. I'll send you the model I send for the view. 'Follow my template:

public class CadastrarAgendamentoViewModel
    {
        public int Id { get; set; }

        public int ClienteId { get; set; }

        [Required(ErrorMessage="Campo obrigatório")]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
        public DateTime Data_Agendamento { get; set; }

        [Required(ErrorMessage = "Campo obrigatório")]
        public string Hora_Agendamento { get; set; }

        public int Atendido_Agendamento { get; set; }
        public int Id_Cliente { get; set; }

        [Required(ErrorMessage = "Campo obrigatório")]
        public int Id_Funcionario { get; set; }
        public IList<SelectListItem> ListaDeFuncionarios { get; set; }

        public Nullable<int> Id_Produto { get; set; }
        public IList<SelectListItem> ListaDeProdutos { get; set; }

        public List<T_Servicos> Servicos { get; set; }

        public double Preco_Agendamento { get; set; }

        public bool Sucesso { get; set; }

        public string Mensagem { get; set; }

        public CadastrarAgendamentoViewModel()
        {
            Servicos = new List<T_Servicos>();
        }

        public LayoutHelper helper { get; set; }
    }
}

My intention is to dynamically arrange the checkboxes in a table.

'

    
27.05.2014 / 04:41