kicked11
kicked11

Reputation: 117

MVC: best way to display data from 2 tables in 1 view

I'm trying to make a view that has data from 2 tables in my database. I have looked up a couple things and I tried to use a ViewModel but I can't get it to work. Then I was thinking about using a view and a partial view to display data from the 2 tables. What is the best way using the ViewModel or using a view and a partial view?

Also if someone knows what I am doing wrong with my ViewModel and wants to help that would be awesome.

my 2 models:

public partial class prospect
{
    public prospect()
    {
        this.result = new HashSet<result>();
    }

    public int id { get; set; }
    public int testid { get; set; }
    public string name { get; set; }
    public string surname { get; set; }
    public string email { get; set; }
    public string cellnumber { get; set; }
    public System.DateTime timestampstart { get; set; }
    public Nullable<System.DateTime> timestampend { get; set; }
    public Nullable<int> totalresult { get; set; }
    public string birthdate { get; set; }
    public string school { get; set; }
    public Nullable<int> grade { get; set; }
    public string address { get; set; }
    public string cityandcode { get; set; }

    public virtual ICollection<result> result { get; set; }
    public virtual resultpersection resultpersection { get; set; }
}

public partial class resultpersection
   {
    public int id { get; set; }
    public int prospectid { get; set; }
    public int sectionid { get; set; }
    public Nullable<int> result { get; set; }

    public virtual prospect prospect { get; set; }
    public virtual section section { get; set; }
}

The things I want to display are: prospect.name , prospect.surname, prospect.totalresult and all the results per section of this prospect(this comes from the resultpersection table)

my viewmodel:

namespace testAptitude.Models
{
  public class ResultsPerProspect
  {

    public List<prospect> prospect { get; set; }
    public List<resultpersection> resultPerSection { get; set; }
 }
}

my controller

public ActionResult Index()
    {
        ResultsPerProspect vm = new ResultsPerProspect();
        vm.prospect = (from p in db.prospect select p).ToList();
        vm.resultPerSection = (from rps in db.resultpersection select rps).ToList(); ;
        List<ResultsPerProspect> viewModelList = new List<ResultsPerProspect>();

        viewModelList.Add(vm);


        return View(viewModelList.AsEnumerable());
    }

my view

 @model IEnumerable<testAptitude.Models.ResultsPerProspect>

@{
   ViewBag.Title = "Index";
}

<h2>Index</h2>
<table>
    <thead>
        <tr>
        <th class="col-sm-3">
            @Html.DisplayNameFor(model => model.prospect)
        </th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(model => item.prospect)
            </td>
        </tr>
    }
    </tbody>
</table>

I can't do item.prospect.name because it say's that is doesn't contain a definition for name

and what is dispalys now is this:

prospect

System.Collections.Generic.HashSet`1[testAptitude.Models.result]

Thanks in advance!

Upvotes: 1

Views: 1138

Answers (2)

Nitin Varpe
Nitin Varpe

Reputation: 10694

With your current code you can access it using

@Html.DisplayNameFor(model => model.FirstOrDefault().prospect)

You are passing IEnumerable<testAptitude.Models.ResultsPerProspect> to your view i.e multiple objects of class ResultsPerProspect. You would need to iterate throught this List. Each items in this list will contain definition for prospect and resultPerSection.

Or you can pass single object of class ResultsPerProspect as you are just adding single element in list.

UPDATE You have List Of ResultsPerProspect. and each item of ResultsPerProspect has List of prospect and List of resultPerSection. So you would need to first iterate for loop over List Of ResultsPerProspect. and inside that for loop , for loop for List of prospect List of and resultPerSection

CODE

  @foreach (var item in Model)
    {

    foreach (var pros in item.prospect)
        {
            <tr>
                <td>
                    @Html.DisplayFor(model => pros.Name)
                </td>
            </tr>
        }
    }

Upvotes: 1

Rob
Rob

Reputation: 11788

Why don't you create a class ("Container") that consists of your two (sub)classes (let's say A and B)? You can then create a Container object and put the needed objects in Container.A and Container.B. You can then easly pass "Container" to your view and access your objects.

Upvotes: 0

Related Questions