c# - .Net Core 2.0 Drill down functionality w/Razor Pages

标签 c# asp.net-core-2.0 razor-pages

目前我正在学习 razor pages 并且有 WPF 背景。

我正在以行格式显示一些数据,但想创建如下所示的向下钻取格式:http://jsfiddle.net/zey3h41o/

我可以从一个模型创建顶级数据的摘要,然后创建一个显示数据结构的子条目的向下钻取功能,如下所示:

List<Tuple<HighLevelOutput, List<HighLevelOutput>>>

和模型

    public struct HighLevelOutput
    {
    public string CorpCustomer { get; set; }
    public string Item { get; set; }
    public string ItemDescription { get; set; }
    public double SummedOrder  { get; set; }
    public double SummedForecast { get; set; }
    public int Week { get; set; }
    public double Difference { get; set; }
    public string UoM { get; set; }
    }

我的 Razor 页面:

@page
@model DemandControlTool.Pages.CalculateLogModel
@{
ViewData["Title"] = "CalculateLog";
}

<h3>Abnormal Demand</h3>

<table class="table">
    <thead>
        <tr>
            <th></th>
            <th>
                @Html.DisplayNameFor(model => model.ReportHighLevel[0].CorpCustomer)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ReportHighLevel[0].Item)
            </th>
            <th class="text-center">
                @Html.DisplayNameFor(model => model.ReportHighLevel[0].SummedOrder)
            </th>
            <th class="text-center">
                @Html.DisplayNameFor(model => model.ReportHighLevel[0].SummedForecast)
            </th>
            <th class="text-center">
                @Html.DisplayNameFor(model => model.ReportHighLevel[0].Difference)
            </th>
        </tr>
    </thead>
</table>

<table class="log">
    <thead class="log">
        @foreach (var item in Model.DropDownAllOrders)
    {
        <tr>
            <th>
                @Html.DisplayFor(modelItem => item.Item1.Item)
            </th>
            <th>
                @Html.DisplayFor(modelItem => item.Item1.ItemDescription)
            </th>
            <th>
                @Html.DisplayFor(modelItem => item.Item1.CorpCustomer)
            </th>
            <th class="text-center">
                @Html.DisplayFor(modelItem => item.Item1.SummedOrder)
            </th>
            <th class="text-center">
                @Html.DisplayFor(modelItem => item.Item1.SummedForecast)
            </th>
            <th class="text-center">
                @Html.DisplayFor(modelItem => item.Item1.Difference)
            </th>
        </tr>
}
    </thead>
    <tbody class="collapsed">
        <tr><td>Drill Down Data</td></tr>
        <tr><td>Drill Down Data</td></tr>
    </tbody>
</table>

我遇到的问题是填充表格,我可以在其中每行下方折叠条目。按照我一直在玩的方式,我需要为列表中的每个对象定义一个单独的行。我希望那里的 body 类有每个摘要行的列表。

在上面的示例中,折叠的主体仅出现在底行下方。

更新编辑:

 @page
@model DemandControlTool.Pages.CalculateLogModel
@{
    ViewData["Title"] = "CalculateLog";
}


<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link href="~/bootstrap.css" rel="stylesheet" />
    <title>Data page</title>
</head>
<body>
    <div class="container">
        <div id="accordion">
            @{int counter = 0; }
            @foreach (var dataVM in Model.CollapseReport)
            {
                <div class="card">
                    <div class="card-header" id="heading@(counter)">
                        <h5 class="mb-0">
                            <button class="btn btn-link" data-toggle="collapse" 
    data-target="#collapse@(counter)" aria-expanded="true" aria- 
    controls="collapse@(counter)">
                                @dataVM.ToString()
                            </button>
                        </h5>
                    </div>

                    <div id="collapse@(counter)" class="collapse" aria- 
   labelledby="heading@(counter)" data-parent="#accordion">
                        <div class="card-body">
                            <ul class="list-group">
                                @foreach (var item in dataVM.WeeksOfData)
    {
                            <li class="list-group-item col-xs-6">@item.Item</li>
                            <li class="list-group-item col-xs-6">@item.ItemDescription</li>
                            <li class="list-group-item col-xs-6">@item.CorpCustomer</li>
                            <li class="list-group-item col-xs-6">@item.Difference</li>
                            <li class="list-group-item col-xs-6">@item.Week</li>

}
                            </ul>
                        </div>
                    </div>
                </div>
                counter++;
            }
        </div>
    </div>
    <script src="~/jquery.min.js"></script>
    <script src="~/bootstrap.bundle.min.js"></script>
</body>
</html>

最佳答案

根据您提供的示例,我为您的问题考虑了一个不同的解决方案,我认为它更简单并且更适合网络,首先我在我的内部使用了 JQuery 和 Bootstrap v.4前端代码,然后我使用了两个组件,它们是:

  1. List group
  2. Collapse

然后我为我的数据形状创建了一个 View 模型,其中包含一个带有项目列表的标题(我使用字符串仅用于演示)如下:

public class DataViewModel
{
    public string Title { get; set; }
    public IEnumerable<string> Data { get; set; }
}

并创建一个 Index an action,如下所示(只是为了填充一些数据并将其传递给 View :

        public IActionResult Index()
    {
        var pageViewModel = new List<DataViewModel>()
        {
            new DataViewModel()
            {
                Title="First data tab",
                Data=new string []{"Item 1","Item 2","Item 3"}
            },
            new DataViewModel()
            {
                Title="Second data tab",
                Data=new string []{"Item 1","Item 2","Item 3"}
            }
        };
        return View(pageViewModel);
    }

最后的 View 代码是这样的:

@model IEnumerable<ProgrammerGallery.Controllers.DataViewModel>
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link href="~/bootstrap.min.css" rel="stylesheet" />
    <title>Data page</title>
</head>
<body>
    <div class="container">
        <div id="accordion">
            @{int counter = 0; }
            @foreach (var dataVM in Model)
            {
                <div class="card">
                    <div class="card-header" id="heading@(counter)">
                        <h5 class="mb-0">
                            <button class="btn btn-link" data-toggle="collapse" data-target="#collapse@(counter)" aria-expanded="true" aria-controls="collapse@(counter)">
                                @dataVM.Title
                            </button>
                        </h5>
                    </div>

                    <div id="collapse@(counter)" class="collapse show" aria-labelledby="heading@(counter)" data-parent="#accordion">
                        <div class="card-body">
                            <ul class="list-group">
                                @foreach (var item in dataVM.Data)
                                {
                                    <li class="list-group-item">@item</li>

                                }
                            </ul>
                        </div>
                    </div>
                </div>
                counter++;
            }
        </div>
    </div>
    <script src="~/jquery.min.js"></script>
    <script src="~/bootstrap.bundle.min.js"></script>
</body>
</html>

最后的结果是:

First result Second result

第二版(当页面呈现在并排显示实体数据而不是字符串数据旁边时的可折叠项):

实体类:

public class Entity
{
    public string Name { get; set; }
    public string BriefDescription { get; set; }
    public double Price { get; set; }
}

查看模型类:

public class DataViewModel
{
    public string Title { get; set; }
    public IEnumerable<Entity> Data { get; set; }
}

Action :

        public IActionResult Index()
    {
        var pageViewModel = new List<DataViewModel>()
        {
            new DataViewModel()
            {
                Title="First data tab",
                Data=new List<Entity>()
                {
                    new Entity()
                    {
                        Name="First item",
                        BriefDescription="My description",
                        Price=1000
                    },
                    new Entity()
                    {
                        Name="Second",
                        BriefDescription="My description",
                        Price=500
                    },
                    new Entity()
                    {
                        Name="Third",
                        BriefDescription="My description",
                        Price=1000
                    }
                }
            },
            new DataViewModel()
            {
                Title="Second data tab",
                Data=new List<Entity>()
                {
                    new Entity()
                    {
                        Name="First item",
                        BriefDescription="My description",
                        Price=1000
                    },
                    new Entity()
                    {
                        Name="Second",
                        BriefDescription="My description",
                        Price=500
                    },
                    new Entity()
                    {
                        Name="Third",
                        BriefDescription="My description",
                        Price=1000
                    }
                }
            }
        };
        return View(pageViewModel);
    }

最后是 Razor 代码:

    @model IEnumerable<ProgrammerGallery.Controllers.DataViewModel>
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link href="~/bootstrap.min.css" rel="stylesheet" />
    <title>Data page</title>
</head>
<body>
    <div class="container">
        <div id="accordion">
            @{int counter = 0; }
            @foreach (var dataVM in Model)
            {
                <div class="card">
                    <div class="card-header" id="heading@(counter)">
                        <h5 class="mb-0">
                            <button class="btn btn-link" data-toggle="collapse" data-target="#collapse@(counter)" aria-expanded="true" aria-controls="collapse@(counter)">
                                @dataVM.Title
                            </button>
                        </h5>
                    </div>

                    <div id="collapse@(counter)" class="collapse" aria-labelledby="heading@(counter)" data-parent="#accordion">
                        <div class="card-body">
                            <ul class="list-group">
                                @foreach (var item in dataVM.Data)
                                {
                                    <li class="list-group-item">@($"Name :{item.Name}, {item.BriefDescription}, {item.Price}$")</li>
                                }
                            </ul>
                        </div>
                    </div>
                </div>
                counter++;
            }
        </div>
    </div>
    <script src="~/jquery.min.js"></script>
    <script src="~/bootstrap.bundle.min.js"></script>
</body>
</html>

关于c# - .Net Core 2.0 Drill down functionality w/Razor Pages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50029149/

相关文章:

c# - ASP.Net & EF Core 2 和并发 token 错误

.net-core - 需要对不同类型的 Razor HTML 输入语法进行一些说明

c# - 带有 id 的 asp.net core 2 razor 页面路由

c# - Razor 页面 (blazor) 正在对字符进行编码

c# - 如何将通用参数传递给局部 View

c# - 集合被修改;枚举操作可能无法执行 - 为什么?

c# - 将 OnAudioFilterRead 与 playOnAwake 一起使用

debugging - AspNetCore 应用程序在生产中泄漏线程 - 如何调试?

c# - ASP.NET MVC @Html.LabelFor(model => model.Name) 助手

c# - ASP.NET Core 2.0 - 配置 ["TestSecret"] 总是返回 null