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

Sil*_*ows 5 c# routing asp.net-core 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 页面的相似性,我尝试了这一点。

我发现我可以用整数路由,但对字符串没有运气。我也遇到过这个Microsoft 文档,它解释了路由参数并在我的页面路由中建议了 **。这允许我进入我的页面,但是我需要使用 ? 在我的电子邮件请求之前,页面没有加载我的数据,因为我可以看到它没有将参数拉入我的变量中。任何有关客户端 Blazor 路由的建议或帮助将不胜感激!

请求代码:

NavigationManager.NavigateTo($"/ManageGradingExamResults/?{student.Email}");
Run Code Online (Sandbox Code Playgroud)

请求网址:

https://localhost/ManageGradingExamResults/?1234@high.school.nz
Run Code Online (Sandbox Code Playgroud)

剃刀页面路线:

@page "/**ManageGradingExamResults/{StudentEmail}"
@page "/ManageGradingExamResults"
Run Code Online (Sandbox Code Playgroud)

我的变量:

@code
{
    [Parameter]
    public string StudentEmail { get; set; }
...
Run Code Online (Sandbox Code Playgroud)

Ath*_*ras 6

从您共享的文档中:

在 Blazor 服务器应用中,_Host.cshtml 中的默认路由是 / (@page "/")。包含点 (.) 的请求 URL 与默认路由不匹配,因为该 URL 看起来是在请求文件。Blazor 应用针对不存在的静态文件返回 404 - 未找到响应。要使用包含点的路由,请使用以下路由模板配置 _Host.cshtml: @page "/{**path}"

基于.net core中的路由

在链接生成期间,路由系统对双星号 (**) 包罗万象的参数(例如,{**myparametername})中捕获的值进行编码(正斜杠除外)

所以这应该对你有用

@page "/ManageGradingExamResults/{**StudentEmail}"
Run Code Online (Sandbox Code Playgroud)

  • 我很确定这是针对 Blazor 服务器端的,而问题是针对 Blazor 客户端的 (2认同)

Kev*_*ski 6

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

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

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

@page "/ManageGradingExamResults/{StudentEmail}"
Run Code Online (Sandbox Code Playgroud)

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

@page "/GradingExamResults/{StudentEmail}/Manage"
Run Code Online (Sandbox Code Playgroud)