Razor Pages, обработчик страницы формы не работает с методом GET - PullRequest
0 голосов
/ 12 июня 2018

У меня есть небольшой проект ASP.NET Core 2.1 Razor Pages.Я делаю простую страницу отображения списка с основными функциями поиска.В моей модели у меня есть 4 обработчика страниц (2 из них добавлены для целей отладки):

        public async Task OnGetAsync()
        {
            Posting = await _context.Postings
                .Include(p => p.ItemDetails).Include(p => p.Owner).ToListAsync();
        }

        public async Task OnPostAsync()
        {
            Posting = await _context.Postings
                .Include(p => p.ItemDetails).Include(p => p.Owner).ToListAsync();
        }

        public async Task<PageResult> OnGetSearchAsync(String search)
        {
            if (String.IsNullOrEmpty(search))
            {
                search = search.Trim();
                Posting = await _context.Postings.Where(p => p.ItemDetails.ItemName.Contains(search)).ToListAsync();
            }
            return Page();
        }

        public async Task<PageResult> OnPostSearchAsync(String search)
        {
            if (!String.IsNullOrEmpty(search))
            {
                search = search.Trim();
                Posting = await _context.Postings.Where(p => p.ItemDetails.ItemName.Contains(search)).ToListAsync();
            }
            return Page();
        }

Когда в форме указано method="post" с asp-page-handler="search", форма вызывает правильный обработчик (OnPostSearchAsync(String search)).Однако когда в форме указывается method="get" с asp-page-handler="search", форма вызывает неправильный обработчик (OnGetAsync()).Это предназначено?Если да, то как я могу вызвать пользовательский обработчик при использовании метода GET?Возможно, использовать пользовательский обработчик не обязательно, но я думаю, что смогу, если захочу.

Вот соответствующий код в .cshtml файле:

<div id="posting_search_bar_container">
    <form method="get" asp-page-handler="search">
        <input type="text" name="search" />
        <input type="submit" value="Ara" />
    </form>
</div>
<div id="posting_list_container">
    @if (Model.Posting != null)
    {
        @foreach (var posting in Model.Posting)
        {
            <partial name="./Partials/_Posting" model="new Pages.Postings.Partials.PostingModel(posting);" />
        }
    }
</div>

Спасибо зачитать!

1 Ответ

0 голосов
/ 13 июня 2018

В терминах почему это происходит, этот ответ должен объяснить, что здесь происходит.По сути, asp-page-handler устанавливает URL-адрес действия, который включает в себя ?handler=search, который затем отбрасывается браузером для запросов GET.

С точки зрения обходных путей я вижу два:

Вариант 1 - Настройка маршрутизации

Взятые прямо из документов, вы можете немного изменить директиву страницы в .cshtml для настройки маршрутизации:

@page "{handler?}"

Этот параметр указывает, что для данной страницы используйте дополнительный сегмент для указания имени обработчика, а не устанавливайте его в качестве параметра строки запроса.Это означает, что ваши звонки изменятся, например, с /PageName?handler=handlerName на /PageName/Handler.? в выражении {handler?} из фрагмента кода просто указывает, что имя обработчика является необязательным, и поэтому по умолчанию будет, например, OnGetAsync.

. Эта опция работает, поскольку больше нет запросастроковое значение для браузера в мусорное ведро, но при этом имя обработчика * фиксируется в самом маршруте.

Option 2 - использовать скрытый ввод

При отправке формы с помощью GET на определенный URL-адрес действия браузер создает строку запроса из элементов управления, которые находятся внутри формы.Это дает возможность добавить новое скрытое поле ввода в форму:

<form method="get">
    <input type="hidden" name="handler" value="search" />
    <input type="text" name="search" />
    <input type="submit" value="Ara" />
</form>

Здесь я удалил asp-page-handler и добавил скрытый ввод, который в итоге установит значение строки запроса:handler до search, который создает строку запроса, которая будет соответствовать OnGetSearchAsync в вашем примере.

...