How to send 2 Controller objects to View in C#?

Question:

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 the 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 dadosPessoa object to the view , but do I need to send the dadosContato too?

How do I send the 2 objects to the View ?

Answer:

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

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

But, I prefer to use all the forms for you to know and use 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 transferring the two pieces of 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 within 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>
Scroll to Top