.Net Core 2.0 Развернуть функциональность с Razor Pages - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время я изучаю бритвенные страницы и пришел из фона 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; }
    }

Страница моего бритвы:

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

Проблема, с которой я столкнулся, заключается в заполнении таблицы, в которой я могу разместить свернутые записи под каждой строкой.По тому, как я с ней играл, мне нужно было иметь отдельную определенную строку для каждого объекта в списке.Мне бы хотелось, чтобы в этом классе тела был список для каждой итоговой строки.

В приведенном выше примере свернутое тело отображается только под нижней строкой.

Обновленное редактирование:

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

1 Ответ

0 голосов
/ 25 апреля 2018

Основываясь на приведенном вами примере, я подумал о другом решении вашей проблемы, которое, на мой взгляд, более простое и намного лучше вписывается в сеть, прежде всего я использовал JQuery и Bootstrap v.4 внутри моегокод переднего плана, тогда я использовал два компонента, которые они являются:

  1. Список группы
  2. Свернуть

После этого я создаю модель представления для моей фигуры данных, которая содержит заголовок со списком элементов (я использую строки только для демонстрации) следующим образом:

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

И создаю Индекс для действияследующим образом (просто для заполнения некоторых данных и передачи их в представление:

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

Наконец, код представления выглядит следующим образом:

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

Режим просмотраl класс:

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

Действие:

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

И, наконец, код бритвы:

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