How to send 2 Controller objects to the View in C # ASP.Net MVC?

8

I made a query in the database in 2 tables and saved in 2 objects in the controller , but I can only send 1 object to view .

// Controller
// Pego os dados do BD e salvo no objeto
var objPessoa = new PessoaAplic();
var dadosPessoa = objPessoa.ListarPorId(id);

// Pego os dados do BD e salvo no objeto
var objContato = new ContatoAplic();
var dadosContato = objContato.ListarPorId(dadosPessoa.IdPessoa);

return View(dadosPessoa);

I'm sending the object dadosPessoa to the view , but I need to send the dadosContato too?

How do I send the 2 objects to the View ?

    
asked by anonymous 06.10.2015 / 21:22

3 answers

7

You can submit via ViewBag , ViewData or make a class that contains the information (list, item) to be consumed in your View ( ViewModel )

You can use any of the 3 correctly, for example, loading a Dropdownlist is very simple with ViewBag . If you are going to pass many class objects and you want to keep all this standard you can use a ViewModel that represents all these class objects.

But, I prefer to go through all the forms so that you know and use them properly ...

ViewBag

public ActionResult View(int id)
{
    var objPessoa = new PessoaAplic();
    var dadosPessoa = objPessoa.ListarPorId(id);

    ViewBag.DadosPessoa = dadosPessoa;

    var objContato = new ContatoAplic();
    var dadosContato = objContato.ListarPorId(dadosPessoa.IdPessoa);

    ViewBag.DadosContato = dadosContato;

    return View();
}

ViewData

public ActionResult View(int id)
{
    var objPessoa = new PessoaAplic();
    var dadosPessoa = objPessoa.ListarPorId(id);

    ViewData.Add("DadosPessoa",dadosPessoa);

    var objContato = new ContatoAplic();
    var dadosContato = objContato.ListarPorId(dadosPessoa.IdPessoa);

    ViewData.Add("DadosContato",dadosContato);

    return View();
}

ViewModel

Class responsible for trafficking both information:

public class ViewModel

{
    public ViewModel(PessoaAplic pessoa, ContatoAplic contato)
    {
        Pessoa = pessoa;
        Contato = contato;

    }

    public PessoaAplic Pessoa { get; private set; }
    public ContatoAplic Contato { get; private set; }
}

Solution inside the Controller

public ActionResult View(int id)
{
    var objPessoa = new PessoaAplic();
    var dadosPessoa = objPessoa.ListarPorId(id);

    var objContato = new ContatoAplic();
    var dadosContato = objContato.ListarPorId(dadosPessoa.IdPessoa);

    ViewModel viewModel = new ViewModel(dadosPessoa, dadosContato);

    return View(viewModel);
}

Views:

ViewBag

@{
    Layout = null;

    WebApplication2.Models.PessoaAplic Pessoa = (WebApplication2.Models.PessoaAplic)ViewBag.DadosPessoa;
    WebApplication2.Models.ContatoAplic Contato = (WebApplication2.Models.ContatoAplic)ViewBag.DadosContato;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>View</title>
</head>
<body>
    <div> 
    </div>
</body>
</html>

ViewData

@{
    Layout = null;

    WebApplication2.Models.PessoaAplic Pessoa = (WebApplication2.Models.PessoaAplic)ViewData["DadosPessoa"];
    WebApplication2.Models.ContatoAplic Contato = (WebApplication2.Models.ContatoAplic)ViewData["DadosContato"];
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>View</title>
</head>
<body>
    <div> 
    </div>
</body>
</html>

ViewModel

@model WebApplication2.Models.ViewModel
@{
    Layout = null;

    WebApplication2.Models.PessoaAplic Pessoa = Model.Pessoa;
    WebApplication2.Models.ContatoAplic Contato = Model.Contato;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>View</title>
</head>
<body>
    <div> 
    </div>
</body>
</html>
    
06.10.2015 / 21:34
7

Create a ViewModel :

public class PessoaContatosViewModel
{
    public PessoaAplic Pessoa { get; set; }
    public ContatoAplic Contato { get; set; }
}

Usage:

// Controller
// Pego os dados do BD e salvo no objeto
var viewModel = new PessoaContatosViewModel {
    Pessoa = objPessoa.ListarPorId(id),
    Contatos = objContato.ListarPorId(dadosPessoa.IdPessoa)
};

return View(viewModel);

Do not forget to change View :

@model MeuProjeto.ViewModels.PessoaContatosViewModel
    
06.10.2015 / 21:29
4

You have to encapsulate them into another object. You can do this in several ways, one of which is to create a viewmodel :

public class PessoaViewModel {
    public Pessoa Pessoa {get; set;}
    public Contato Contato {get; set;}
}

There you go:

return View(new PessoaViewModel {Pessoa = dadosPessoa , Contato = dadosContato});

The type of properties I kicked, since I used var in the code and I have no way to know what the result of the operations performed. Adapt to the required type.

    
06.10.2015 / 21:30