我有一个页面,该页面需要这样的一些路由值:
@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)不会从重定向中消失。
如何清除值并仅重定向到页面?
P.S。 在这种情况下,Url.Page(PageName)也将返回“ / pageName / 2018”。路由值不会被删除。
P.P.S。 我只是想让用户体验更好。 如果用户键入了不正确的页面地址(即“ / pageName / 2018”),我想从地址中删除该不正确的部分(2018),并显示默认页面,例如简单的“ / pageName”。
P.P.P.S。 我知道我可以弄乱与地址栏一起使用的JS东西,但是不喜欢这种方法。
答案 0 :(得分:2)
当重定向到同一页面或操作时,链接生成在生成目标URL时会考虑环境值,即当前路由的路由值。我已经asked about this,显然,这样做主要是为了允许使用Url.Action()
或Url.Page()
链接回完全相同的页面,这与HTML中相对URL的工作方式类似。 / p>
但是,您始终可以通过在RedirectToPage
调用中明确指定路由值来覆盖环境值:
return RedirectToPage("Test", new
{
reportYear = (int?)null,
reportMonth = (int?)null,
});
这将显式地将路由值设置为null
,并覆盖仍作为环境值存在的所有值。