none
Passando IEnumerable como parametro para um método ActionResult RRS feed

  • Pergunta

  • Boa noite pessoal,

    Estou tentando implementar um CheckBox List e eu até
    consegui, mas o método Post sempre retorna null o atributo regiões.

    Será que alguém pode me ajudar?

    Considerem os códigos abaixo:

    //
    // Controller
    //
    
    //
    // GET: /Regiao/Edit/
    
    public ActionResult Edit()
    {
    	return View(db.Regiao);
    }
    
    //
    // POST: / Edit /Selecao/
    
    [HttpPost]
    public ActionResult Edit (IEnumerable<Regiao> regioes)
    {
    	string n = "";
    
    	//
    	// Não consigo manipular, pois o atributo sempre retorna null
    	//
    	foreach (var item in regioes)
       	{
    		n = item.Nome;
    	}
    
    	return RedirectToAction("Index");
    }
    
    //
    // View
    //
    @model IEnumerable<Guia.Models.Regiao>
    
    @{
        ViewBag.Title = "Selecao";
    }
    
    <h2>Selecao</h2>
    
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    
    @using (Html.BeginForm()) {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Regiao</legend>
    
            <table>
                <tr>
                    <th>
                        Nome
                    </th>
                    <th>
                        Checked
                    </th>
                    <th></th>
                </tr>
    
                @foreach (var item in Model) {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Nome)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.Checked)
                    </td>
                </tr>
                }
    
            </table>
            <p>
                <input type="submit" value="Save" />
            </p>
    
        </fieldset>
    }
    

    quarta-feira, 7 de março de 2012 03:27

Todas as Respostas

  • List<T> implementa IEnumerable então você pode usar no seu ActionResult assim:

    public ActionResult Edit (List<Regiao> regioes)

    quarta-feira, 7 de março de 2012 16:11
    Moderador
  • Mudei para List<Regiao> porem o parametro regioes continua vindo null

    [HttpPost]

    public ActionResult Edit (List<Regiao> regioes)
    {
    	string n = "";
    
    	//
    	// Não consigo manipular, pois o atributo sempre retorna null
    	//
    	foreach (var item in regioes)
       	{
    		n = item.Nome;
    	}
    
    	return RedirectToAction("Index");
    }

    quarta-feira, 7 de março de 2012 18:41
  • Seu problema agora é no Model Binding.

    Para conseguir recuperar uma lista com sucesso na action seu form tem que retornar a lista de valores separados por vírgula (por exemplo um DropDownList com o attributo "multiple".

    Model Binding em uma lista de um tipo complexo precisa de um pouco mais de esforço na view para funcionar.

    No seu caso mais ou menos assim:

     @Html.CheckBox("Checked[" + i.ToString() + "].IsSelected", item.IsSelected);

    Que renderizaria algo do tipo:

    <input type="checkbox" id="Checked_0" name="Checked[0]" />

    <input type="checkbox" id="Checked_1" name="Checked[1]" />

    quarta-feira, 7 de março de 2012 23:04
    Moderador
  • João...

    Você poderia dar um exemplo um pouco mais completo... tipo com view e controller nao precisa ser inteiro apenas com as partes principais...

    Comecei a pouco tempo mexer com asp.net ainda estou meio perdido...

    Valeu...

    sexta-feira, 9 de março de 2012 01:06
  • Consegui resolver o problema!

    // Controller
            //
            // GET: /Home/Edit/5
     
            public ActionResult Selecao()
            {
                return View(db.Categories.ToList());
            }
     
            //
            // POST: /Home/Edit/5
     
            [HttpPost]
            public ActionResult Selecao(List<Categories> categorias)
            {
                bool b = false;
                
                foreach (var item in categorias)
                {
                    b = item.Checked;    
                }
     
                return RedirectToAction("Index");
            }
     
    // View
    @model List<CheckBoxList.Models.Categories>
     
    @{
        ViewBag.Title = "Selecao";
    }
     
    <h2>Selecao</h2>
     
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
     
    @using (Html.BeginForm()) {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Categories</legend>
     
            <ul>
                @for (int i = 0; i < Model.Count; i++)
                {
                    <li>@Html.CheckBoxFor(item => item[i].Checked) - @Html.DisplayFor(item => item[i].CategoryName) @Html.HiddenFor(item => item[i].CategoryID)</li>
                }        
            </ul>
     
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    }
     
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    

    segunda-feira, 12 de março de 2012 20:34