如何使用包含点(。)的字符串route参数在客户端blazor中进行路由?

时间:2019-12-29 10:18:52

标签: c# asp.net-core routing blazor blazor-client-side

您好,堆栈溢出

我正在使用客户端Blazor,偶然发现了有关使用字符串和点(。)进行路由的棘手部分。我希望从管理控制页面路由到具有以下路由的页面:@page "/ManageGradingExamResults/{StudentEmail}"。我使用以下请求进行了测试:https://localhost/ManageGradingExamResults/1234@high.school.nz,但找不到。如果将剃须刀路径更改为@page "/ManageGradingExamResults/{*StudentEmail}",我将遇到以下异常:System.InvalidOperationException: Invalid template 'ManageGradingExamResults/{*StudentEmail}'. The character '*' in parameter segment '{*StudentEmail}' is not allowed.。由于cshtml页面中的相似之处,我尝试了这一点。

我发现我可以使用整数进行路由,但是对字符串没有运气。我还碰到过this微软文档,解释了溃败参数并在页面路由中建议了**。这使我进入页面,但是我需要使用?。在请求中发送电子邮件之前,该页面未加载我的数据,因为我看到它没有将参数拖入变量中。  在客户端Blazor中进行路由的任何建议或帮助将不胜感激!

请求代码:

NavigationManager.NavigateTo($"/ManageGradingExamResults/?{student.Email}");

请求网址:

https://localhost/ManageGradingExamResults/?1234@high.school.nz

剃刀页面路线:

@page "/**ManageGradingExamResults/{StudentEmail}"
@page "/ManageGradingExamResults"

我的变量:

@code
{
    [Parameter]
    public string StudentEmail { get; set; }
...

2 个答案:

答案 0 :(得分:1)

From the documentation you have shared:

  

在Blazor Server应用程序中,_Host.cshtml中的默认路由为/(@页面“ /”)。包含点(。)的请求URL与默认路由不匹配,因为该URL似乎是在请求文件。 Blazor应用针对不存在的静态文件返回404-Not Found响应。要使用包含点的路由,请使用以下路由模板配置_Host.cshtml:   @page "/{**path}"

Based on routing in .net core

  

在链接生成过程中,路由系统将捕获的值编码为除正斜杠之外的双星号(**)通用参数(例如{** myparametername})

所以这应该为您解决问题

@page "/ManageGradingExamResults/{**StudentEmail}"

答案 1 :(得分:1)

Blazor 文档 (https://docs.microsoft.com/en-us/aspnet/core/blazor/fundamentals/routing?view=aspnetcore-5.0#routing-with-urls-that-contain-dots) 建议修改服务器上的回退文件路由。

从 Azure Blob 静态网站或 Amazon S3 托管时,这是不可能的。由于假设点位于 uri 的最右端时是一个文件,因此请考虑移动参数。

URI 最右端带点的参数。这将导致 404,因为 StudentEmail 参数包含一个点并将作为文件路由(假设您无法修改服务器 Startup.Config)。

@page "/ManageGradingExamResults/{StudentEmail}"

移动参数,使其不在 URI 的最右端: 这将正确路由并将 StudentEmail 参数传递给组件。

@page "/GradingExamResults/{StudentEmail}/Manage"