手动刷新时找不到带有抛出参数&404的Blazor服务器页面 [英] Blazor server page with parameters throwing "404 not found " on manual refreshes

查看:34
本文介绍了手动刷新时找不到带有抛出参数&404的Blazor服务器页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Blazor Server应用程序,其页面接受URI中的参数。当我单击具有使用参数(如下所示)访问该页面的路由设置的锚定标记时,链接工作正常,并且页面加载。

<a href="/MyPage/{@Param1}/{@Param2}"> <!--link content in here--> </a>
但是,如果用户尝试直接从该URL访问页面,或者在浏览器中手动刷新,则页面不会重新初始化或命中参数上的任何断点。相反,它会抛出404 Not Found。

这里有两件事:

  • 首先,我搞不懂为什么它在锚标记中工作得很好,但却以其他方式死亡。尤其是当@page指令中没有参数的页面与刷新/直接URL配合使用时更是如此。
  • 第二,这是Blazor Server的预想行为,还是我在这里遗漏了什么,直接破坏了页面刷新/点击-url?看起来不像功能,但可能是我误解了Blazor的路由。

问题页面的Razor和Razor.cs:

@page "/MyPage/{Param1}/{Param2}"

<h1>MyPage</h1>

<Metrics Param1="@Param1" />

<Details Param1="@Param1" Param2="@Param2" />

<InProgress Param1="@Param1" Param2="@Param2" />

<InQueue Param1="@Param1" />

<br />
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Components;
using MyApp.Data.Models.ApiResponse;

namespace MyApp.Pages
{
    public partial class MyPage
    {
        [Parameter]
        public string Param1 { get; set; }

        [Parameter]
        public string Param2{ get; set; }

        public TaskList Tasks { get; set; }

        protected override Task OnInitializedAsync()
        {
            // work in progress, intend to do more here later on
            var test = "";
            return base.OnInitializedAsync();
        }
    }
}

编辑--每个评论建议

Startup.cs中Configure方法的UseEndpoint部分:

 app.UseEndpoints(endpoints =>
            {
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });

进一步挖掘后,我注意到@param2偶尔会有.字符。Blazor确实需要配置params with dots in them的路由。以下回退不起作用:

endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/MyPage");

它抛出一个: InvalidOperationException: Cannot find the fallback endpoint specified by route values: { page: /MyPage, area: }.

我猜area:为空是个问题,但我找不到如何或在哪里正确设置。链接中的示例在后备中仅显示页面的名称。有没有人能指出这个后退有什么问题,怎样才能正确地纠正它?

推荐答案

我的问题是参数值中有一个点字符。如果路由问题来自参数中的一个点,则执行docs建议的操作会奏效(图中所示)。您需要为该特定路由指定回退,如下所示:

endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/_Host");

对于WASM项目:您希望指定html文件vs_Host,该文件应该特定于Blazor Server。

endpoints.MapFallbackToFile("/MyPage/{Param1}/{Param2}", "index.html");

应用此设置后,刷新页面或直接访问URL应该会使您的应用程序按预期工作,不会再出现与App.razor中的标准<NotFound>标记设置不同的404错误。

要点:

  • 检查您的url参数是否有任何已知的分析异常,如点(Blazor假设这些是被请求的文件)
  • 使用应用程序的默认页面进行回退,而不是要访问的页面。在_Host用于wasm的服务器应用程序中,它是index.html

这篇关于手动刷新时找不到带有抛出参数&404的Blazor服务器页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆