6
respostas

Passando Objetos para um novo Controller

Boa Tarde Senhores, apos o termino do curso resolvir treinar o meu aprendizado realizando um sistema de login e senha um pouco mais robusto. Porem algumas duvidas surgiram e mesmo pesquisando nas aulas do curso e na internet nao consegui achar uma solução.

Montei 1 formulário de login e tenho uma ActionResult para capturar os dados do formulário via POST.

A validação funciona normalmente sem problemas e apos a validação estou dando return

RedirectToAction("Index", "DashBoard", );

Como pode ser visto no ActionResult abaixo:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult LoginIn(String usuario, String senha)
        {

            UsuariosDAO dao = new UsuariosDAO();
            Usuario u = dao.BuscaPorUsuarioESenha(usuario, senha);
            if(u != null)
            {
               return RedirectToAction("Index", "DashBoard", );
            }
            else
            {

                return RedirectToAction("Index");
            }
         }

A duvida é a seguinte: Quero mandar os dados da Classe Usuario para o View do Controller DashBoard para que eu possa exibir os dados do usuário logado na View do Controller DashBoard, Acredito que a boa pratica é enviar esses dados para o ActionResult do DashBoard e depois envia-lo para a view certo? Alguem pode me explicar como devo fazer? Obrigado!

6 respostas

Diego o que você fez está certo porque trata-se de um redirecionamento se você ler a documentação do RedirectToAction no site da microsoft. Nele é possível você enviar um objeto para que seja construído com o htlm.

Segue a documentação : https://msdn.microsoft.com/pt-br/library/system.web.mvc.controller.redirecttoaction(v=vs.118).aspx

return RedirectToAction(String, Object);

Mas no caso do usuário que não está cadastrado você deve usar o :

return return View();

Pois se trata da mesma página .

Uma coisa bacana que encontrei enquanto pesquisa é o ciclo de vida apsnet.

https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/getting-started/lifecycle-of-an-aspnet-mvc-5-application/_static/lifecycle-of-an-aspnet-mvc-5-application1.pdf

Obrigado pela ajuda! porem mesmo olhando a documentação da microsft no link que você postou ainda estou na duvida de como devo proceder na parte do código, olhando a documentação acredito que eu precisaria usar :

Método Controller.RedirectToAction (String, String, Object)

onde o primeiro parametro string seria a action name, a segunda o controller name e o object teria q que ser a classe?

isso que não estou conseguindo entender

public class Usuario {
       public int id { get; set; 
       public string nome { get; set; }
      public string usuario { get; set; }
}
UsuarioDAO dao = new UsuarioDAO();
Usuario u = new Usuario();
u = dao.Lista();

return RedirectToAction("Index", "DashBoard", u);

Seria isso? Se sim, ainda existe outrea duvida: se eu quisesse passar várias classes? por exemplo?

Me desculpe mais mesmo olhando a documentação não consigo entender ao certo como devo proceder. Obrigado!

Sim seria exatamente isso. Respondendo a segunda dúvida, só é possível passar um Objeto caso queria fazer isso com outros objetos você pode usar partial views ou criar uma view model, viewbag.

Mas dentro da sua página sempre terá apenas uma diretiva que especifica o objeto que irá ser renderizado.

http://www.eduardopires.net.br/2013/08/asp-net-mvc-view-model-pattern-quando-e-como-utilizar/

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/partial

Leandro mesmo passando um único objeto, se eu passar a classe inteira no ReturntoAction ele chega como null no outro controlador, se eu passo apenas um parâmetro ele chega na url no método GET sabe me dizer o porque? Chegar o parâmetro como o id do usuário já resolveria porém seria necessario realizar novamente a mesma consulta para pegar os dados do usuário e isso q eu não queria...

Certo imaginando o fluxo que você está me descrevendo fica assim.

public class Usuario : Controller {
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult LoginIn(String usuario, String senha)
        {
                UsuariosDAO dao = new UsuariosDAO();
                Usuario u = dao.BuscaPorUsuarioESenha(usuario, senha);
                if(u != null)
                {
                       return RedirectToAction("Index", "DashBoard", u);
                }
                else
                {
                    return View("Index");
                }
         }
}
public class DashBoard : Controller{

    [HttpGet]
    public void Index(Usuario usuario){
        // demais operações aqui 
        return View(usuario);
    }
}

Dentro da pasta views, ficaria assim.

views /Dashboard/Index.cshtml

@model Models.Usuario
<!DOCUMENT html>
Aqui o que você deseja exibir do usuário.

Algumas recomendações primeira delas é verificar se o objeto do usuário está sendo obtido do banco de dados. Outro ponto que você deve verificar é se ele chega na controller Dashboard.

E por fim fim na sua página.

Verifiquei aqui o objeto usuário está sendo obtido do banco, porém mesmo enviando ele no RedirectToAction ele chega no outro controller null, não sei o que fazer, nao estou conseguindo entender a logica de funcionamento..