Сортировка таблиц MVC работает нормально при использовании значений маршрута, но не при использовании параметров строки запроса - PullRequest
1 голос
/ 03 октября 2019

У меня есть приложение MVC 5 (C # и BootStrap), и на некоторых страницах, конечно же, есть таблицы. Я использовал рекомендованный метод сортировки столбцов, который я нашел в Microsoft tutorial , и он, кажется, работает нормально. Он работает путем передачи информации сортировки столбцов в ViewBag.

Вот пример URL: ... localhost / PhoneDirectory / Employee / Search / chris / dept_desc Этот URL выполняетпоиск по названию Крис и сортировки по столбцу Департамент по убыванию. Прекрасно работает.

И с магией MVC это также работает (URL вместо параметров строки запроса): ... localhost / PhoneDirectory / Employee / Search? Query = chris & sortorder = dept_desc

Однако, когда я использую второй URL с параметрами строки запроса, кажется, что это нарушает сортировку моего столбца. Например, когда я снова щелкаю по столбцу Department, вот как выглядит URL: ... localhost / PhoneDirectory / Employee / Search? SortOrder = Department Обратите внимание, как параметр запроса исчезает в обратной записи.

Вот маршрут, который я настроил для этой страницы.

        routes.MapRoute(
            name: "NameSearchRoute", 
            url: "Employee/Search/{query}/{sortOrder}", 
            defaults: new { controller = "Employee", action = "Search", sortOrder = UrlParameter.Optional }
        );

Я бы хотел сохранить параметр запроса во время обратной передачи при сортировке. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

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

<table class="table">
    <tr>
        <th class="hidden-xs">

        </th>
        <th class="hidden-xs">
            @Html.ActionLink(Html.DisplayNameFor(model => model.LastNameFirstName).ToHtmlString(), "Search", new { sortOrder = ViewBag.NameSortParm })
        </th>
        <th class="hidden-xs">
            @Html.DisplayNameFor(model => model.FormattedPhone)
        </th>
        <th class="hidden">
            @Html.DisplayNameFor(model => model.FormattedPhone)
        </th>
        <th class="hidden-xs">
            @Html.ActionLink(Html.DisplayNameFor(model => model.JobTitle).ToHtmlString(), "Search", new { sortOrder = ViewBag.TitleSortParm })
        </th>
        <th class="hidden-xs">
            @Html.ActionLink(Html.DisplayNameFor(model => model.DepartmentName).ToHtmlString(), "Search", new { sortOrder = ViewBag.DeptSortParm })
        </th>
        <th class="hidden-xs">
            @Html.ActionLink(Html.DisplayNameFor(model => model.FacilityName).ToHtmlString(), "Search", new { sortOrder = ViewBag.LocSortParm })
        </th>
    </tr>

Но когда я добавил параметр запроса в заголовок, он работал фантастически.

<table class="table">
    <tr>
        <th class="hidden-xs">

        </th>
        <th class="hidden-xs">
            @Html.ActionLink(Html.DisplayNameFor(model => model.LastNameFirstName).ToHtmlString(), "Search", new { query = ViewBag.Message, sortOrder = ViewBag.NameSortParm })
        </th>
        <th class="hidden-xs">
            @Html.DisplayNameFor(model => model.FormattedPhone)
        </th>
        <th class="hidden">
            @Html.DisplayNameFor(model => model.FormattedPhone)
        </th>
        <th class="hidden-xs">
            @Html.ActionLink(Html.DisplayNameFor(model => model.JobTitle).ToHtmlString(), "Search", new { query = ViewBag.Message, sortOrder = ViewBag.TitleSortParm })
        </th>
        <th class="hidden-xs">
            @Html.ActionLink(Html.DisplayNameFor(model => model.DepartmentName).ToHtmlString(), "Search", new { query = ViewBag.Message, sortOrder = ViewBag.DeptSortParm })
        </th>
        <th class="hidden-xs">
            @Html.ActionLink(Html.DisplayNameFor(model => model.FacilityName).ToHtmlString(), "Search", new { query = ViewBag.Message, sortOrder = ViewBag.LocSortParm })
        </th>
    </tr>

Теперь я могу принять такой URL-адрес из других систем: ... localhost / PhoneDirectory / Employee / Search? Query = chris и когда пользователь нажимает на заголовок столбца для сортировкив результате создается новый URL-адрес, подобный этому ... localhost / PhoneDirectory / Employee / Search / chris / dept_desc , и это именно то, что я хотел.

0 голосов
/ 03 октября 2019

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

@using (Html.BeginForm())
{
    <p>
        Find by name: @Html.TextBox("SearchString")  
        <input type="submit" value="Search" /></p>
}

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

Следующим шагом будет сохранение страницы «состояние» где-нибудь и ее отправка обратно. и вперед с каждым запросом. Вы уже делаете это с ViewBag, но обычно мы используем связывание моделей для этого. Если вы продолжите обучение, вы скоро найдете Model Binding. Это руководство действительно помогает сохранить SearchTerm. Я вижу дальше вниз по странице (в разделе, где они вводят пейджинг), для этого они используют ViewBag.

Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)

Итак, в конце действия Index () убедитесь, что вы устанавливаете ViewBag.CurrentFilter. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...