MVC:在1个视图中显示来自2个表的数据的最佳方式

时间:2014-03-28 07:39:02

标签: asp.net-mvc viewmodel

我正在尝试创建一个包含数据库中2个表的数据的视图。我查了几件事我试图使用ViewModel,但我无法让它工作。然后我考虑使用视图和部分视图来显示来自2个表的数据。使用ViewModel或使用视图和部分视图的最佳方法是什么?

此外,如果有人知道我的ViewModel出了什么问题,并想帮助那将是非常棒的。

我的两个模特:

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; }
}

我要展示的内容是: prospect.name,prospect.surname,prospect.totalresult以及此前景的每个部分的所有结果(来自结果表)

我的viewmodel:

namespace testAptitude.Models
{
  public class ResultsPerProspect
  {

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

我的控制器

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());
    }

我的观点

 @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>

我不能做item.prospect.name,因为它说它不包含名称的定义

现在显示的是:

前景

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

使用当前代码,您可以使用

访问它
@Html.DisplayNameFor(model => model.FirstOrDefault().prospect)

您正在将IEnumerable<testAptitude.Models.ResultsPerProspect>传递给您的视图,即类ResultsPerProspect的多个对象。您需要遍历此List。此列表中的每个项目都将包含prospectresultPerSection的定义。

或者您可以传递类ResultsPerProspect的单个对象,因为您只是在列表中添加单个元素。

<强>更新 你有ResultsPerProspect列表。 ResultsPerProspect的每个项目都包含prospect的列表和resultPerSection的列表。因此,您需要首先迭代List Of ResultsPerProspect循环。在for循环中,for循环用于prospect列表和resultPerSection

CODE

  @foreach (var item in Model)
    {

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

答案 1 :(得分:0)

为什么不创建一个由两个(子)类组成的类(&#34;容器&#34;)(让我们说A和B)?然后,您可以创建一个Container对象,并将所需的对象放在Container.A和Container.B中。然后,您可以轻松地通过&#34; Container&#34;到您的视图并访问您的对象。