对于我的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中的数据。
答案 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大声呼救。