Реализация сортировки с помощью основных страниц ASP.NET - PullRequest
0 голосов
/ 04 октября 2018

Я написал следующий код для реализации сортировки.Я хочу сохранить sortingData (OrderDirection, SortField) между двумя запросами на сортировку.Почему-то я не могу этого достичь.

// На странице .cshtml

    @{
        SortingPagingInfo info = (SortingPagingInfo)ViewData["SortingPagingInfo"];
    }
<form method="post">
    @Html.Hidden("SortField", info.SortField)
    @Html.Hidden("SortDirection", info.SortDirection)
    @Html.Hidden("PageCount", info.PageCount)
    @Html.Hidden("PageSize", info.PageSize)
    @Html.Hidden("CurrentPageIndex", info.CurrentPageIndex)
 <table class="table">
        <thead>
            <tr>
                <th>
                    <a asp-page="./Page" asp-route-sortData="@info">
                        @Html.DisplayNameFor(model => model.Tabl[0].Col1)
                    </a>

                </th>
                <th>
                    <a asp-page="./Page" asp-route-sortData="@info">
                        @Html.DisplayNameFor(model => model.Tabl[0].Col2)
                    </a>

                </th>
 <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Table)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Col1)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Col2)
                    </td>
</tr>
            }
        </tbody>
    </table>

</form>

----- На странице cshtml.cs

Запрос getкак показано ниже:

public async Task OnGetAsync(SortingPagingInfo sortData)
        {
            SortingPagingInfo info = new SortingPagingInfo();
            if (string.IsNullOrEmpty(sortData.SortDirection))
            {
                info.SortField = "Col1";
                info.SortDirection = "OrderBy";
                info.PageSize = 10;
                info.PageCount = Convert.ToInt32(Math.Ceiling((double)(_context.Tab.Count()
                               / info.PageSize)));
                info.CurrentPageIndex = 0;
                this.sortPageData = info;
                ViewData["SortingPagingInfo"] = info;
            }
            else
            {
                info = (SortingPagingInfo)ViewData["SortingPagingInfo"];
            }
            tab1= await _context.Tabl.OrderByDynamic(info.SortField, info.SortDirection).ToListAsync();


        }

Я пытаюсь передать объект и сохранить его в ViewData, чтобы к нему можно было получить доступ.Но каждый раз возвращается только нулевое значение.Есть ли лучший способ для реализации сортировки с Razor Pages или если это можно сделать, чтобы работать?

1 Ответ

0 голосов
/ 04 октября 2018

Вы не можете просто сбросить объект как параметр данных маршрута в ссылке.Здесь действительно произойдет то, что Razor просто вызовет ToString на вашем info экземпляре.У вас есть несколько вариантов:

  1. Выделите каждое свойство и передайте его индивидуально:

    <a asp-page="./Page" asp-route-sortField="@info.SortField" asp-route=sortDirection="@info.SortDirection" asp-route-pageCount="@info.PageCount" asp-route-pageSize="@info.PageSize" asp-route-currentPageIndex="@info.CurrentPageIndex">
    
  2. Сериализуйте объект, а затем десериализуйте его вваше действие:

    <a asp-page="./Page" asp-route-sortData="@JsonConvert.SerializeObject(info)">
    

    Затем ваше действие должно быть изменено, чтобы принять строку:

    public async Task OnGetAsync(string sortData)
    

    А внутри действия вы затем десериализовали бы эту строку обратно вэкземпляр SortingPagingInfo:

    var info = JsonCovert.DeserializeObject<SortingPagingInfo>(sortData);
    
  3. Вместо этого сделайте так, чтобы ваши ссылки отправляли кнопки (вы все еще можете оформить их как ссылки), и чтобы они действительно отправляли форму со всеми этими данными:

    <form asp-page-handler="./Page" method="get">
        @Html.Hidden("SortField", info.SortField)
        @Html.Hidden("SortDirection", info.SortDirection)
        @Html.Hidden("PageCount", info.PageCount)
        @Html.Hidden("PageSize", info.PageSize)
        @Html.Hidden("CurrentPageIndex", info.CurrentPageIndex)
        <button type="submit" class="btn btn-link">
            @Html.DisplayNameFor(model => model.Tabl[0].Col1)
        </button>
    </form>
    

    Однако в настоящее время у вас есть форма, охватывающая всю таблицу, и вы не можете иметь формы внутри форм.В результате вам нужно будет реструктурировать свой HTML-код, чтобы каждая из этих ссылок находилась вне любых других форм на странице.

...