none
MVC - Como passar um IEnumerable Model para um Controller?? RRS feed

  • Pergunta

  • Tenho uma Partial View com um model IEnumerable:

    @model  IEnumerable<Modelo.Usuario>

    @using (Ajax.BeginForm("_Edit", "Usuario",
        new AjaxOptions
        {
           ...
            HttpMethod = "POST",
           ...
        }, new { id = "..." }))
    {

            @foreach (var item in Model)
            {

                  @Html.LabelFor(model => item.nome)

             }

            <input type="submit" value="Salvar" />

    }

     

    Gostaria de saber como eu posso receber o model IEnumerable por meio de POST no controller. Tentei da forma a seguir, mas sempre recebo o model mull.

     [HttpPost]
            public ActionResult _Edit(IEnumerable<Usuario> usuario)
            {

                          .....

            }

     

    Agradeço se alguém puder ajudar.

     




    • Editado JeanMarcelo5 segunda-feira, 28 de novembro de 2011 00:19
    domingo, 27 de novembro de 2011 20:55

Respostas

Todas as Respostas

  • IEnumerable, apesar de poder ser o retorno de uma função, é uma interface.

    Os objetos tais como a maioria das listas do .net podem implementar IEnumerable

    Use então um objeto concreto, uma lista tipada (List<T>) por exemplo como parâmetro da sua função:

     [HttpPost]
            public ActionResult _Edit(List<Usuario> usuario)
            {
    
                          .....
    
            }
    

     


    segunda-feira, 28 de novembro de 2011 00:59
    Moderador
  • Olá, eu mudei conforme vc disse, mas agora estou recebendo o erro:

    The entity type List`1 is not part of the model for the current context.

     

      [HttpPost]
            public ActionResult _Edit(List<Usuario> usuario)
            {          
              
                if (ModelState.IsValid)
                {               
                    db.Entry(usuario).State = EntityState.Modified;
                    db.SaveChanges();
                    if (Request.IsAjaxRequest())
                        return Content(Boolean.TrueString);
                    else
                        return RedirectToAction("Index");
                }
                else
                {
                    return Content("Verifique os dados inseridos!");
                 
                }
            }

    segunda-feira, 28 de novembro de 2011 01:09
  • Tem que ver como está seu formulário pois o mesmo também tem que "espelhar" o Model para que o mesmo seja enviado para a Action.
    segunda-feira, 28 de novembro de 2011 16:25
    Moderador
  • @model List<Modelo.Usuario>
    
    @using System.Collections
    
    @{  
      
        <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
        <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
    }
    
    @using (Ajax.BeginForm("_Edit", "Usuario",
        new AjaxOptions
        {
            UpdateTargetId = "divEditUsuario",
            InsertionMode = System.Web.Mvc.Ajax.InsertionMode.Replace,
            HttpMethod = "POST",
            OnSuccess = "jsSuccessEUR"
        }, new { id = "ajaxEditUsuario" }))
    {
    
        <div id="divEditUsuario">
        </div>
        
        @Html.ValidationSummary(true)
        
        <table id="dataTable">
            <thead>
                <tr>
                    <th>
                        Usuários
                    </th>               
                </tr>
            </thead>
            <tbody>
    
         @for (int i = 0; i < Model.Count(); i++)
         {
                    @Html.HiddenFor(model => Model[i].Id)
                
                    <tr >
                        <td>
                            @Html.DisplayFor(model => Model[i].Usuarios.Nome)
                            @Html.HiddenFor(model => Model[i].UsuarioId)
                        </td>                
                   
                        <td>                    
                            <input type="submit" value="Alterar" />
                        </td>
                    </tr>
         }
            </tbody>
        </table>
    }
    



    O formulário acime é responsável por enviar via "POST" os dados para o Controller abaixo:

    [HttpPost]
            public ActionResult _Edit(List<Usuario> usuario)
            {    
                if (ModelState.IsValid)
                {               
                    db.Entry(usuario).State = EntityState.Modified;
                    db.SaveChanges();
                    if (Request.IsAjaxRequest())
                        return Content(Boolean.TrueString);
                    else
                        return RedirectToAction("Index");
                }
                else
                {
                    return Content("Verifique os dados inseridos!");
                 
                }
            }



    Se puder ajudar, agradeço.


    • Editado JeanMarcelo5 segunda-feira, 28 de novembro de 2011 17:08
    segunda-feira, 28 de novembro de 2011 16:39
  • Coloque um breakpoint nesta linha:

    db.Entry(usuario).State = EntityState.Modified;

    E verifique se o objeto usuário está vindo como null.

    Nesta linha

    db.Entry(usuario).State = EntityState.Modified;

    não sei se o framework consegue atualizar toda uma lista assim automaticamente.

    Minha abordagem é passar a lista para um serviço ou repositório e tratar em uma dessas camadas cada objeto da lista individualmente.

     

    segunda-feira, 28 de novembro de 2011 19:49
    Moderador
  • Ele traz alguns dados porém incorretos.

    Não está trazendo os dados referentes ao POST, talvez seja essa a razão de dar o erro The entity type List ao tentar salvar os dados.

     

    Gostaria apenas de pegar os dados da View com o Model List e alterar os dados em um action Controller.

     

    Podeira me dar um exemplo de como tratar cada objeto da lista individualmente?

    terça-feira, 29 de novembro de 2011 02:03
  • foreach(var item in usuario){

        //APLICA AS ALTERAÇÕES NO OBJETO

    }

    _entities.SaveChanges();

    terça-feira, 29 de novembro de 2011 17:32
    Moderador
  • Conseguiu resolver? Estou com o mesmo problema.
    segunda-feira, 26 de fevereiro de 2018 21:41