Как использовать список страниц в контексте нескольких данных в одном контроллере и представлении

#c# #asp.net-mvc #html-table #pagedlist

#c# #asp.net-mvc #html-таблица #список страниц

Вопрос:

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

Я пытался использовать переменные page и pageNumber и данные ViewBag для каждого из них, но это не работает.

ViewModel:

 public sealed class FileViewModel
{
    private readonly IFileDataContext _context;

    static FileViewModel()
    {

    }
    private FileViewModel()
    {
        _context = new FileDataContext();
    }

    private static readonly FileViewModel fileViewModel = new FileViewModel();
    public static FileViewModel Instance { get { return fileViewModel; } }
    public FileData FileDados { get; set; }
    public IPagedList<FileDocs> FileDocs { get; set; }
    public IEnumerable<FileDocs> ServicoDocs { get; set; }
    public IPagedList<FileRequisition> Requisicoes { get; set; }
    public IPagedList<FileService> Servicos { get; set; }
    public IEnumerable<FileService> ServicosAgrupado { get; set; }
}
  

Контроллер:

 public ActionResult GetFile(int fileCodigo, int? page)
{
    //fileCodigo = 190562;

    //Variaveis
    int pageSize = 5;
    int pageNumber = (page ?? 1);
    ViewBag.FileCodigo = fileCodigo;

    var docsGeraisFile = Directory.EnumerateFiles(directoryPath, "*", SearchOption.AllDirectories).ToList();

    //GetFile
    FileViewModel.Instance.FileDados = _context.GetFileByFileCode(fileCodigo).FirstOrDefault();

    //GetFileDocs
    FileViewModel.Instance.FileDocs = _context.GetFileIntraByFile(fileCodigo)
        .Where(fd => fd.NivelArquivo == fileCodigo.ToString()).ToPagedList(pageNumber, pageSize);

    //GetServicos
    FileViewModel.Instance.Servicos = _context.GetServicosByFile(fileCodigo).DistinctBy(s => s.CodServico).ToPagedList(pageNumber, pageSize);

    //GetServiceDocs
    var fs = _context.GetServicosByFile(fileCodigo)
        .Select(s => s.CodServico).ToList();
    FileViewModel.Instance.ServicoDocs = _context.GetFileIntraByFile(fileCodigo)
        .Where(ds => ds.NivelArquivo == fs.FirstOrDefault()).ToList();

    FileViewModel.Instance.Requisicoes = _context.GetRequisitionByFile(fileCodigo).DistinctBy(s => s.CodRequisicao).ToPagedList(pageNumber, pageSize);

    return View("Index", FileViewModel.Instance);
}
  

И 3 частичных представления:

 @model AbreuBrasilWebFile.Web.Core.ViewModel.FileViewModel
@using PagedList.Mvc;

@if (Model.FileDocs != null)
{
    <table class="table table-bordered table-condensed table-striped">
        <thead>
            <tr>
                <th><button id="btn-show" class="btn btn-default"><i class="glyphicon glyphicon-plus"></i></button></th>
                <th>Documentos</th>
                <th></th>
                <th>CTB</th>
                <th>COM</th>
                <th>Site</th>
            </tr>
        </thead>
        <tbody>
        @foreach (var itemDocs in Model.FileDocs)
        {
            <tr>
                <td class="hidden">@itemDocs.Id</td>
                <td>@itemDocs.NomeArquivo</td>
                <td>
                    <span class="input-group-addon">
                        <button aria-hidden="false" class="btn btn-default">
                            <i class="glyphicon glyphicon-remove"></i>
                        </button>
                        <button aria-hidden="false" class="btn btn-default">
                            <i class="glyphicon glyphicon-search"></i>
                        </button>
                        <button aria-hidden="false" class="btn btn-default">
                            <i class="glyphicon glyphicon-envelope"></i>
                        </button>
                    </span>
                </td>
                <td><i class="glyphicon glyphicon-eye-open">@itemDocs.CTB</i></td>
                <td><i class="glyphicon glyphicon-eye-close">@itemDocs.COM</i></td>
                <td><i class="glyphicon glyphicon-eye-open">@itemDocs.Site</i></td>
            </tr>
        }
        </tbody>
    </table>
}
@if (Model.FileDocs.PageCount > 1)
{
    <div id="container" style="margin-left: 20px">
        <p></p>
        <p></p>
        <div class="pagination" style="margin-left: 400px">
            Page @(Model.FileDocs.PageCount < Model.FileDocs.PageNumber ? 0 : Model.FileDocs.PageNumber) of @Model.FileDocs.PageCount
            @Html.PagedListPager(Model.FileDocs, page => Url.Action("GetFile", "Files", new { page, pageSize = Model.FileDocs, fileCodigo = ViewBag.FileCodigo }))
        </div>
    </div>
}

@model AbreuBrasilWebFile.Web.Core.ViewModel.FileViewModel
@using PagedList.Mvc;

@if (Model.Requisicoes != null)
{
    <table class="table table-bordered table-condensed table-striped">
        <caption>Requisições</caption>
        <thead>
            <tr>
                <th>Num Req Files</th>
                <th>Tipo Pgto</th>
                <th>Forma Pgto</th>
                <th>Valor Recibo</th>
                <th>Validado CTB</th>
                <th>Serviços Incluídos</th>
                @*<th>Documentos Anexados</th>
                <th></th>
                <th>CTB</th>
                <th>Comercial</th>
                <th>Site</th>*@
            </tr>
        </thead>
        <tbody>
        @foreach (var itemRequisicao in Model.Requisicoes.Take(4))
        {
            <tr>
                <td>@itemRequisicao.CodRequisicao</td>
                <td>@itemRequisicao.Name</td>
                <td>@itemRequisicao.FormaPgto</td>
                <td>@itemRequisicao.ValorRecibo</td>
                <td>@itemRequisicao.ValidadoCtb</td>
            </tr>
        }
        </tbody>
    </table>
}

@model AbreuBrasilWebFile.Web.Core.ViewModel.FileViewModel
@using PagedList.Mvc;

@* File Serviços *@
<table id="#myTable" class="table>
    <caption>Serviços</caption>
    <thead>
        <tr>
            <th>Código</th>
            <th>Descrição Resumida</th>
            <th>Status</th>
            <th>Identificador Reserva</th>
            <th>Paxs</th>
            @*<th>Documentos Anexados</th>
            <th></th>
            <th>CTB</th>
            <th>Comercial</th>
            <th>Site</th>*@
        </tr>
    </thead>
    <tbody>
    @foreach (var itemSe in Model.Servicos)
    {
        <tr>
            <td>@itemSe.CodServico</td>
            <td>@itemSe.DescTipo @itemSe.Identificador </td>
            <td>@itemSe.StatusReserva</td>
            <td>@itemSe.IdentReserva</td>
            <td>@itemSe.PaxsReserva</td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
    }
    </tbody>
</table>
@if (Model.Servicos.PageCount > 1)
{
    <div id="container" style="margin-left: 20px">
        <p></p>
        <p></p>
        <div class="pagination" style="margin-left: 400px">
            Page @(Model.Servicos.PageCount < Model.Servicos.PageNumber ? 0 : Model.Servicos.PageNumber) of @Model.Servicos.PageCount
            @Html.PagedListPager(Model.Servicos, page => Url.Action("GetFile", "Files", new { page, pageSize = Model.Servicos, fileCodigo = ViewBag.FileCodigo }))
        </div>
    </div>
}
  

Ожидается, что разбивка на страницы в каждой таблице перемещается независимо.

Комментарии:

1. Вы используете pageNumber, pageSize переменные для всех 3 коллекций данных, но чтобы сделать их независимыми, у вас должна быть эта пара переменных для каждого свойства списка страниц. И это означает, что всего 6, что звучит ужасно. Поэтому я бы предложил реализовать подкачку для каждой коллекции независимо, используя AJAX (без перезагрузки страницы).

2. Спасибо, чувак. Это не лучший способ, но решает мою проблему.

Ответ №1:

Итак, у меня есть 3 таблицы, и я создаю переменные для PageNumber и page для каждой таблицы. Это не лучшая практика, но решает мою проблему мгновенно.