Перенаправление на страницу бритвы без текущих значений маршрута - PullRequest
0 голосов
/ 26 октября 2018

У меня есть страница, которая ожидает некоторые значения маршрута, такие как:

@page "{reportYear:int:range(2000, 2100)?}/{reportMonth:int:range(1, 12)?}"

Модель выглядит следующим образом:

public async Task<IActionResult> OnGetAsync([FromRoute]int? reportYear, [FromRoute]int? reportMonth)
{
    if (reportYear.HasValue == reportMonth.HasValue) 
    {
        MyViewModel.ReportYear = reportYear ?? DefaultReportYear;
        MyViewModel.ReportMonth = reportMonth ?? DefaultReportMonth;
        return Page();
    }

    return RedirectToPage(PageName);
}

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

И если указан только один из них, перенаправьте на ту же страницу, но без каких-либо значений маршрута, чтобы показать версию по умолчанию ииспользуйте чистый адрес.

Проблема в том, что RedirectToPage перенаправляет с сохранением значений маршрута.Другими словами, если я посещаю "/ pageName / 2018", я получаю перенаправление на то же самое "/ pageName / 2018". Предоставленное значение маршрута (2018) не удаляется из перенаправления.

Как мнеочистить значения и перенаправить только на страницу?

PS Url.Page (PageName) также возвращает «/ pageName / 2018» в этом случае.Значения маршрутов не удаляются.

PPS Я просто хочу, чтобы пользовательский опыт стал немного лучше.Если пользователь ввел неправильный адрес страницы (например, «/ pageName / 2018»), я хочу удалить эту неправильную часть (2018) из адреса и показать страницу по умолчанию, например, «/pageName".

PPPS Я знаю, что могу поиграться с JS, который работает с адресной строкой, но такой подход мне не нравится.

1 Ответ

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

При перенаправлении на ту же страницу или действие при создании целевого URL-адреса при создании целевого URL учитываются внешние значения, то есть значения маршрута для текущего маршрута. Я спросил об этом , и, по-видимому, это в первую очередь делается для того, чтобы разрешить использование Url.Action() или Url.Page() для ссылки на точно такую ​​же страницу, аналогично тому, как относительные URL работают в HTML.

Однако вы всегда можете перезаписать окружающие значения, явно указав значения маршрута в вызове RedirectToPage:

return RedirectToPage("Test", new
{
    reportYear = (int?)null,
    reportMonth = (int?)null,
});

Это явным образом установит значения маршрута на null и перезапишет все значения, которые все еще существуют, как окружающие значения.

...