【问题标题】:blazor not changing the page when clicking on a link单击链接时,blazor 不会更改页面
【发布时间】:2021-06-18 11:26:20
【问题描述】:

我正在将我的个人博客迁移到 Blazor,但遇到了问题。我正在开发“下一篇文章”功能,当单击链接时,blazor(或浏览器)不会重定向用户。帖子是下一条路线下的“同一页”@page "/post/{Url}

例如,用户位于domain.com/post/foo,并且在该站点中有指向domain.com/post/bar 的链接。 这是一个简单的链接,如下所示:

<a href="post/bar" title="@Post.Title">
    @Post.Title 
</a>

当用户点击链接时,浏览器的 url 会发生变化,页面的位置会移动到顶部,但页面内容没有变化。

我注意到当我从post 页面点击到另一个页面时会发生这种行为,但不会从网站的“索引” (/) 或当我点击帖子上的标签时发生,链接到domain.com/tags/{tag}

需要注意的一点是,如果我在浏览器中选择 url 并单击 enter 或刷新页面,它实际上会转到我单击的页面,在这种情况下为 domain.com/post/bar

我的问题是,这是实际预期的行为还是错误?如果这是预期的行为,是否有任何方法可以使 url 实际转到单击的 url 而不是留在同一页面中。

如果这很重要,我正在使用 net5.0。

谢谢。

【问题讨论】:

  • 既不是预期也不是错误。还有第三种可能。
  • 你为什么不为一个不起作用的特定链接分享一些代码。基本上,如果它不导航,它就无法识别路线。在您的示例中,它不知道post/bar。当您说单击链接时没有导航时,究竟发生了什么?没什么,页面刷新,....我们需要一些线索。漏洞?你在做别人没有做的事吗?
  • @ShaunCurtis 代码就是这样,将bar 更改为@post/url 转换为bar;完全相同的代码在网站的索引中起作用。我会分享更多代码,但我不知道要写什么。当我单击链接时,URL 会更改,并且滚动条会转到顶部。但内容本身并没有改变。
  • 好的。一些问题。在带有链接的页面上,您显示什么是(at)页面 url?在您希望使用 url post/bar 加载的页面上,(at)page url 是什么。当您单击链接时,页面是否刷新 - 观看微调器的浏览器选项卡?临时发布到 Github Repo?
  • @ShaunCurtis 所以我的当前页面是http://localhost:44310/post/title1 并且我试图从那个页面访问http://localhost:44310/post/title2作为一个链接(href="post/@post.url")。因此,当我单击链接时,url 实际上从 title1 更改为 http://localhost:44310/post/title2 但没有微调器或任何东西。我也检查了 f12 和控制台/网络,那里也没有。我不能真正分享一个工作版本(密码和废话硬编码)所以我不确定是否值得清理

标签: c# asp.net .net asp.net-core blazor


【解决方案1】:

作为@enet 答案的补充,您可能正在获取OnInitialized/OnInitializedAsyncUrl 属性引用的帖子。请参阅@enet 答案中的最后一段。

解决这个问题的一种方法是:

  • 将加载数据的代码放在单独的方法中,例如LoadDataAsync
  • SetParameters/SetParametersAsync 中检测数据引用(在您的情况下为Url)是否已更改,如果是,请致电LoadDataAsync

这里的关键是了解组件生命周期并将代码放在正确的位置。

OnInitializedSetParameters 上放置断点,并在加载和导航时观察它们何时被击中。

【讨论】:

    【解决方案2】:

    当我从post 页面点击进入另一个页面时

    domain.com/post/foodomain.com/post/bar 中的post 绝对不是页面而是文字路径段。

    我创建了一个名为 Foo 的可路由组件:

    Foo.razor

    @page "/post/foo"
    
    @code {
    }
    

    Foo 是一个可路由的组件;也就是说,它是一个页面,可以通过在浏览器的地址栏中键入 url、使用锚元素或 NavigationManager 来访问。您也可以将其嵌入到父组件中。

    post,正如我上面所说,是一个文字路径段

    但如果你坚持认为帖子实际上是一个组件页面,那么我猜它可能看起来像这样:

    Post.razor

    @page "/post"
    @page "/post/{Param}"
    <a href="post/bar" title="Title">
    Title 
    </a>
    
    <div>@Param</div>
    @code {
    
        [Parameter]
        public string Param {get;set;}
    }
    

    现在,当您在地址栏中输入如下网址时: https://localhost:&lt;port-number&gt;/post

    您将被导航到发布可路由组件(页面)

    如果点击锚元素,地址栏的url会变成https://localhost:&lt;port-number&gt;/post/bar

    bar 不是组件;它是一个参数。地址栏变了,但是你好像在同一个帖子组件中,但是数据或者内容,确实变了……

    请注意,当您单击锚元素时,您将被导航到 一个新的 Url(“post/bar”),但渲染引擎不会创建 Post 组件的新实例来渲染页面,而是将其视为具有更改参数的同一页面。因此,看起来没有发生任何导航,除了地址栏中的 url 之外,没有任何变化。我并不是说您的问题是相同的,但它可能源于类似的代码使用。 请注意,由于 Blazor 不会创建新的组件实例,而是使用现有的组件实例,因此 OnInitialized(Async) 对只能运行一次......因此您必须使用 SetParametersAsync 方法(“ on initializedAsync 正在获取”nextPost “来自后端的信息,但它只是一个普通的 http cal”)

    以上所有内容都是为了要求您做最简单的事情并提供路线模板........

    bar 是一个组件吗? foo 是一个组件吗?

    【讨论】:

    • 嗨,感谢您的回答,是的,我使用`@page "/post/{Param}"` 为帖子制作模板,所以问题是组件没有被重新渲染。我刚刚使用 SetParametersAsync 进行了测试,似乎可以正常工作,我必须在所有子元素中都这样做,但似乎是可行的方法,谢谢。
    • @TigreX 正如我所怀疑的那样,请参阅下面我在帖子中与您的评论交叉的附加答案。 [竖起大拇指]
    【解决方案3】:

    因为它违反了 ASPNetCore 团队的一些组件参数建议,所以撤回了答案 - 请参阅 https://github.com/dotnet/aspnetcore/issues/24599

    【讨论】:

    • 你不应该改变参数的状态。您可以读取参数属性的值,但不能更改其值。将参数属性视为自动属性,史蒂夫·安德森如是说。
    • setter 是一个非常标准的方法,这就是我在 setter 触发的伪事件中所做的 - 导致重新渲染。注释中的以下部分是相关的 - 该问题仅发生因为在 repro 案例中设置参数值确实具有副作用,包括触发对父级的另一个重新渲染。因此,解决方案是单独保留参数通信通道(即,不要写入属性,也不要放入具有副作用的集合逻辑)。 我的解决方案有副作用!我已经编辑了答案以撤回它,但留下了编辑/评论线索。
    • 不确定您是否需要删除您的答案。我的评论仅提及您的代码改变了参数属性这一事实,并且您应该避免这种做法...我没有真正检查您的代码,但是如果一切正常,那么您可以定义一个局部变量参数属性的值,然后你可以随心所欲地操纵和改变这个变量......
    • 我使用的是参数属性设置器版本 - 我已经深入研究了渲染器代码。如果您不完全了解自己在做什么,这是可能的副作用。虽然我很高兴在我的代码中运行它并“理解”我的行为的后果,但我不会向所有人推荐它。
    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2020-02-29
    • 2014-05-17
    • 2020-07-24
    • 2016-06-29
    相关资源
    最近更新 更多