none
Edição de registro MVC RRS feed

  • Pergunta

  • Salve!

    Aplicação MVC (minha primeira), com VS2013, Entity, code first para criar o banco.

    Tenho as seguintes classes:

    public class Usuario
    {
        [Key]
        public string Logon { get; set; }
        public string Nome { get; set; }
        public string Divisao { get; set; }
        public string Email { get; set; }
        public string Depto { get; set; }
    
        public virtual List<Perfil> Perfis { get; set; }
    
        public Usuario()
        {
            this.Perfis = new List<Perfil>();
        }
    }
    
    public class Perfil
    {
        [Key]
        public int Id { get; set; }
        public string Nome { get; set; }
        public string Descricao { get; set; }
    
        public virtual List<Usuario> Usuarios { get; set; }
    
        public Perfil()
        {
            this.Usuarios = new List<Usuario>();
        }
    }

    A partir dessas duas classes foram geradas 3 tabelas no banco: Perfils, Usuarios e UsuarioPerfils.

    Bem, no controller que trata dos usuários tem o par de Actions para editar o usuário: a que monta a view e a que faz o post. Para montar a view eu criei uma outra classe (view model) com o seguinte código:

    public class UsuarioViewModel
    {
        public Usuario Usuario { get; set; }
        public List<Perfil> TodosPerfis { get; set; }
        public int[] PerfisSelecionados { get; set; }
    
        public UsuarioViewModel()
        {
            this.Usuario = new Usuario();
            this.TodosPerfis = new List<Perfil>();
        }
    }


    Action para montar a view:

    public ActionResult EditarUsuario(string logon)
    {
        var usuario = db.Usuarios.Find(logon);
        var usuarioVM = new UsuarioViewModel();
        usuarioVM.Usuario.Logon = usuario.Logon;
        usuarioVM.Usuario.Nome = usuario.Nome;
        usuarioVM.Usuario.Divisao = usuario.Divisao;
        usuarioVM.Usuario.Email = usuario.Email;
        usuarioVM.Usuario.Perfis = usuario.Perfis;
        usuarioVM.TodosPerfis = db.Perfis.ToList();
        usuarioVM.PerfisSelecionados = usuario.Perfis.Select(x => x.Id).ToArray();
        return View(usuarioVM);
    }


    Ok, a view é montada corretamente. Tem um botão de submit para gravar as alterações do usuário que aciona a Action a seguir:

    [HttpPost]
    public ActionResult EditarUsuario(UsuarioViewModel model)
    {
        foreach (var item in model.PerfisSelecionados)
        {
            Perfil perfil = db.Perfis.Find(item);
            model.Usuario.Perfis.Add(perfil);
        }
        if (ModelState.IsValid)
        {
            db.Entry(model.Usuario).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Usuarios");
        }
        return View(model);
    }


    Bem básico, padrão de funcionamento de uma aplicação MVC.

    Acontece que a tabela UsuarioPerfils não está sendo atualizada quando altero os perfis de um usuário. Seja incluindo ou excluindo pefil(s).

    Ao executar pelo Debuger verifico, na post Action, que os perfis foram devidamente alterados, o ModelState é validado e as linhas

    db.Entry(model.Usuario).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Usuarios");
    

    são executadas.

    Qual erro estou cometendo?

    Grato pela atenção de todos.

    Paulo Ricardo Ferreira


    • Editado PRicardo Ferreira terça-feira, 2 de dezembro de 2014 17:09 acrescentas as informações sobre o debuger
    terça-feira, 2 de dezembro de 2014 16:21

Respostas

  • Salve!

    Fuçando um pouco mais, mudei a minha Action para o seguinte:

    [HttpPost]
    public ActionResult EditarUsuario(UsuarioViewModel model)
    {
        Usuario usuario = db.Usuarios.Find(model.Usuario.Logon);
        usuario.Perfis.Clear();
    
        foreach (var item in model.PerfisSelecionados)
        {
            Perfil perfil = db.Perfis.Find(item);
            usuario.Perfis.Add(perfil);
        }
    
        if (ModelState.IsValid)
        {
            db.Entry(usuario).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Usuarios");
        }
        return View(model);
    }
    

    Dessa forma consegui fazer a atualização desejada.

    Agradeço a atenção de todos.

    Paulo Ricardo Ferreira

    quinta-feira, 4 de dezembro de 2014 12:15