【问题标题】:Displaying a table as a matrix将表格显示为矩阵
【发布时间】:2017-05-07 19:09:57
【问题描述】:

对于我的 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中的数据。

【问题讨论】:

  • 你的数据是什么样的?你的 SQL 查询呢?您想加入两个不同的表吗?
  • @silkfire 我的数据类 (classC) 有 3 个属性:public virual ClassA row { get; set;} public virual ClassA column { get; set;}public virual ClassB value { get; set;}。我目前对我的 HTML 页面使用延迟加载,并且我只使用一个表来存储我的数据,没有连接。希望这能回答您的问题。
  • 你能发布你的classA、classB和classC的定义吗?据我了解,classA 引用自身和 classB,而 classC 包含 classA 的列表。将虚拟名称放在上下文中您的意思是:public class Person // classA { public Person Friend { get;放; } 公共地址 HomeAddress { 获取;放; } } public class Address // classB { public string StreetName { get;放; } } public class People // classC { public IList PersonList { get;放; } }
  • @YawarMurtaza - 我编辑了我的问题。我注意到我的 classB 只有 1 个值,所以我可以将它设为 classC 中的枚举...但这并不能解决我的问题。

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


【解决方案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
        }

然后在您的视图中为&lt;th&gt;perB)的每个人创建循环,然后使用嵌套循环为您的&lt;tr&gt;perA)创建循环对于每个相关的&lt;td&gt; (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 添加到您的视图中)

【讨论】:

  • 感谢您的回答。现在我的第一行和第一列正确显示(每个条目一次):) !但是您的 HTML 行对我不起作用,因为我的控制器中没有 rels 数组,而是在我的数据库中设置。我的 classA 中有public virtual ICollection&lt;classC&gt; Rels { get; set; },但是当我在 HTML 文档中调试项目时它似乎是空的。关于如何从我的模型 (classA) 访问数据库的任何想法?
  • @MarcoHabegger 使用相同的Model 和用于在问题中生成第一个表的方法。否则在这里阅读:stackoverflow.com/documentation/asp.net-mvc/769/…
  • @Taysumi 为什么需要从classA 访问classC?创建一个包含 List&lt;classC&gt; Rels {get; set;}List&lt;classA&gt; Persons {get; set;} 的模型,然后改用它。
  • 我现在创建了一个 ViewModel,我在其中加载了我需要的所有数据,并且可以使用您的代码完成 HTML。非常感谢 ! :)
【解决方案2】:

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

我创建了一个 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 中循环遍历每个 personA 的头行:

@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,并且在 PersonA 列中是否包含 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 寻求帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多