Blazor可选路线参数

时间:2019-04-17 17:19:03

标签: blazor

使用dotnet new blazor创建一个新的blazor项目。修改Index.cshtml

@page "/"
@page "/{Id}"

<h1>Id = @Id</h1>

<p><a href="/">Without Id</a></p>
<p><a href="/15">With Id = 15</a></p>

@functions {
    [Parameter]
    public string Id { get; set; }
}

运行应用程序。

当我单击With Id = 15链接时,一切都按预期方式工作-网址已更改,参数{Id}分配给值Id,一切正常。

但是当我单击Without Id链接后,URL更改了,但是我的ID保持不变-等于15。

为什么我的价值没有改变?我在这里想念什么?我该如何解决?

5 个答案:

答案 0 :(得分:1)

此行为是设计使然。 请注意,更改的URL并不表示当前页面已更改。以下JavaScript函数执行更改网址的内部导航: function performInternalNavigation(absoluteInternalHref: string) { history.pushState(null, /* ignored title */ '', absoluteInternalHref); handleInternalNavigation(); }

来源:https://github.com/aspnet/AspNetCore/blob/93127b39e824181d4f9b1a62b6fc8d10c481e2c8/src/Components/src/Microsoft.AspNetCore.Components.Browser.JS/src/Services/UriHelper.ts

调用history.pushState会使URL栏显示“ ... / 15”,但不会导致浏览器加载新的URL,或者不会导致Blazor重新创建Index组件。如果仅URL参数发生更改,Blazor不会重新创建组件。由于您已经在“索引”页面上,因此单击链接“无ID”不会导致重新呈现索引组件。相反,将重用当前的Component实例,但是此实例组件的参数属性设置为15,并且它不会被AssignToProperties方法覆盖,该方法“遍历ParameterCollection,将每个参数分配给相同名称的属性估计的正好。”但是ParameterCollection不包含Id参数。回想一下,这是在您单击“无ID”之后发生的。最终结果还是具有包含值15的参数属性Id。 来源:https://github.com/aspnet/Blazor/blob/29f925852b0a5e81e82780e0c1c32b486f7c3be6/src/Microsoft.AspNetCore.Blazor/Components/ParameterCollectionExtensions.cs

解决此问题的方法:

  1. 像这样重写SetParameters方法:

public override void SetParameters(ParameterCollection parameters) { if (string.IsNullOrEmpty(parameters.GetValueOrDefault<string>("Id"))) { Id = null; } base.SetParameters(parameters); }

  1. 通过继承Router来实现自定义路由逻辑

希望这对您有帮助...

答案 1 :(得分:1)

支持可选的路由参数as of ASP.NET Core 5.0

例如:

@page "/RouteParameter/{text?}"

<h1>Blazor is @Text!</h1>

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

    protected override void OnInitialized()
    {
        Text = Text ?? "fantastic";
    }
}

答案 2 :(得分:0)

有点数字...

您的页面是有状态对象,重新导航到同一页面不会触发重新加载(OnInit)。

当路由器检测到参数时,将执行SetParameter()逻辑。但是没有ClearParameter()。

因此,当您从"/"导航到"/15"时,反之亦然,您是否想要(期望)创建了一个全新的页面?因为那不会发生。

坦率地说,用例似乎很奇怪。只是不要在<a href="/">页面本身上使用"/"

答案 3 :(得分:0)

一个更简单的解决方案是将Id设置为null。不需要“ if”。

library(tidyverse)
files1 <- map(files, ~ .x %>%
                        rename_all(~ toupper(.x)))

或更现代的异步等效方法

答案 4 :(得分:0)

试试这个

@page "/"
@page "/{Id:string}"

<h1>Id = @Id</h1>

<p><NavLink href="/">Without Id</NavLink></p>
<p><NavLink href="/15">With Id = 15</NavLink></p>

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

希望你的问题得到解决