使用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。
为什么我的价值没有改变?我在这里想念什么?我该如何解决?
答案 0 :(得分:1)
此行为是设计使然。
请注意,更改的URL并不表示当前页面已更改。以下JavaScript函数执行更改网址的内部导航:
function performInternalNavigation(absoluteInternalHref: string) {
history.pushState(null, /* ignored title */ '', absoluteInternalHref);
handleInternalNavigation();
}
调用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
解决此问题的方法:
public override void SetParameters(ParameterCollection parameters)
{
if (string.IsNullOrEmpty(parameters.GetValueOrDefault<string>("Id")))
{
Id = null;
}
base.SetParameters(parameters);
}
希望这对您有帮助...
答案 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;}
}
希望你的问题得到解决