将表显示为矩阵

时间:2016-12-22 08:04:01

标签: c# asp.net entity-framework model-view-controller

对于我的ASP.Net MVC Web应用程序,我有一些classA的对象需要引用到classA的每个对象,包括它自己,并且每个连接都需要另一个classB的对象。我已将所有这些对象存储在classC的其他对象中。所有这些数据都存储在数据库中。

这给了我一个巨大的列表,来自classA的对象越多越大,因为当我添加classA的新对象时,需要更新此表,尽管这不是问题的一部分。

现在我想显示这个表,但是作为一个矩阵。

我有:     

    <table border="1">
      <tr>
        <th>Object 1 (classA)</th>
        <th>Object 2 (classA)</th>
        <th>Value (classB)</th>
        </tr>
      <tr>
        <td>ASDF</td>
        <td>ASDF</td>
        <td>value1</td>
        </tr>
      <tr>
          <td>ASDF</td>
        <td>QWER</td>
        <td>value2</td>
        </tr>
      </table>
  

我想:     

    <table border="1">
          <tr>
            <td/>
            <th>Object 1 (classA)</th>
            <th>Object 2 (classA)</th>
            </tr>
          <tr>
            <th>Object 1 (classA)</th>
            <td>value1</td>
            <td>value2</td>
            </tr>
          <tr>
              <th>Object 2 (classA)</th>
            <td>value2</td>
            <td>value1</td>
            </tr>
          </table>

我的问题是,我不能只迭代当前表中的所有条目并将其显示在我的HTML页面上,因为它将是多余的(并且因此很大)。

我现在的问题是,如何根据需要显示我的数据? 我已经找到了类似的问题,但我找到的并没有两次使用同一个班级。

修改
我的描述可能不太准确。这是我的课程(缩短):

public class classA {
    public int Id {get; set;}
    public string Name {get; set;}
}

public class classB {
    public int Id {get; set;}
    public string Value {get; set;}
}

public class classC {
    public int Id {get; set;}
    public virtual classA PersonA {get; set;}
    public virtual classA PersonB {get; set;}
    public virtual classB friendship {get; set;}
}

因此没有对象存储在classA中,只有在classC中,然后我用它来显示HTML中的数据。

2 个答案:

答案 0 :(得分:1)

您可能需要获得一份明确的人员名单,例如:

        var rels = new classC[] { new classC { Id = 11, PersonA = new classA { Id = 1, Name = "one" }, PersonB = new classA { Id = 1, Name = "one" }, friendship = new classB { Id = 11, Value = "1-1" } }
                                , new classC { Id = 12, PersonA = new classA { Id = 1, Name = "one" }, PersonB = new classA { Id = 2, Name = "two" }, friendship = new classB { Id = 12, Value = "1-2" } }
                                , new classC { Id = 21, PersonA = new classA { Id = 2, Name = "two" }, PersonB = new classA { Id = 1, Name = "one" }, friendship = new classB { Id = 21, Value = "2-1" } }
                                , new classC { Id = 22, PersonA = new classA { Id = 2, Name = "two" }, PersonB = new classA { Id = 2, Name = "two" }, friendship = new classB { Id = 22, Value = "2-2" } }
        };

        List<classA> persons;
        if (rels.Any())
        {
            persons = rels.GroupBy(r => r.PersonA.Id)
                            .Select(g => g.First())
                            .Select(r => r.PersonA)
                            .ToList(); // gets a distinc list, you might want to order this too
        }

然后在您的视图中为<th> perB )的每个人创建循环,然后为<tr>创建循环( perA < / em>)每个相关<td> perB )的嵌套循环。然后在您的嵌套循环中,您只需选择friendship.Value例如:

<td>
    @(Model.rels.Where(r=> r.PersonA.Id == perA.Id && r.PersonB.Id == perB.Id).SingleOrDefault()?.friendship?.Value)
<td>

(您可能需要在视图中添加@using System.Linq

答案 1 :(得分:0)

我重写了一个正确的答案,因为我需要做更多的事情......

我创建了一个ViewModel,我将存储我需要的所有数据:

// ViewModel
public List<classA> PersonA {get; set;}
public List<classA> PersonB {get; set;}
public List<classC> Rels {get; set;}

然后将其添加到控制器中:

RelsViewModel vieModel = new RelsViewModel();
viewModel.Rels = db.Rels.ToList();

List<classA> personsA = new List<classA>();
List<classA> personsB = new List<classA>();
foreach (classA item in db.Rels.ToList())
{
    personsA.Add(item.PersonA);
    personsB.Add(item.PersonB);
}

// Distinct() Returns the list without duplicates
viewModel.personsA = personsA.Distinct().ToList();
viewModel.personsB = personsB.Distinct().ToList();

return View(viewModel);

在HTML中,我然后循环遍历每个人A的头行:

@model ZoneMatrix.ViewModel.MatrixViewModel

...

<tr>
    <th>Name</th> @*most top left cell*@
    @foreach (var item in Model.PersonsA)
    {
        <th>@item.name</th>
    }
</tr>

...

然后循环遍历所有personB,循环遍历所有personA嵌套在里面。 PersonsA与PersonsB完全相同,因此您可以检查矩阵表(列PersonB)是否包含item(类型classB)中的id,而PersonAl列中是否包含item2的id(类型classA)。如果是这样,请返回友谊属性:

@foreach (var item in Model.PersonsB)
{
    <tr>
        <th>@item.name</th>
        @foreach (var item2 in Model.PersonsA)
        {
            <td>
                @(Model.Rels.Where(i => i.PersonsB.Id == item.Id && i.PersonsA.Id == item2.Id).SingleOrDefault().friendship.Value)
            </td>
        }
    </tr>
}

向@Aldracor大声呼救。