更新
从 .NET Core 3.1 预览版 1 开始,这种用于将参数传递给所有类型的顶级组件的工具现已恢复,正如 Dan Roth 在 this blog post 中所讨论的那样:
将参数传递给顶级组件
Blazor 服务器应用现在可以将参数传递给顶级组件
在初始渲染期间。以前你只能传递参数
到带有RenderMode.Static 的顶级组件。有了这个版本,
RenderMode.Server 和 RenderModel.ServerPrerendered 现在都是
支持的。任何指定的参数值都被序列化为 JSON 和
包含在初始响应中。
例如,您可以使用特定的
当前计数如下:
Html.RenderComponentAsync<Counter>(RenderMode.ServerPrerendered, new {
CurrentCount = 123 })) ```
原答案
由于performance issues around the stateful prerendering of pages,此功能已被删除,希望是暂时的。
在 Blazor 组件中检索 URL 参数和 ID
希望将参数直接传递给组件的功能将返回,但与此同时,可以通过将NavigationManager(以前称为IUriHelper)注入到 Blazor 组件中来检索来自外部 MVC 页面 URL 的参数组件:
@Inject NavigationManager navigationManager;
然后您可以使用this kind of approach 作为discussed here 从 URL 访问命名参数:
protected override void OnParametersSet()
{
var uri = new Uri(navMan.Uri);
string myparamStr=
Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query).TryGetValue("myparam", out var myparam) ? myparam.First() : "";
}
如果你在寻找来自 URL 的 ID(例如 www.mysite.com/sales/32),那么你可以这样做:
public static bool GetIdFromUri(string uriAddress, out int id)
{
var uri = new Uri(uriAddress);
string lastSegment = uri.Segments.Last();
if (!string.IsNullOrWhiteSpace(lastSegment) && int.TryParse(lastSegment, out var paramId))
{
id = paramId;
return true;
}
id = -1;
return false;
}
使用包装器组件保持关注点分离的完整性
在组件中添加查询 URL 的功能将限制该组件的可重用性,因为它现在依赖于特定格式的 URL。
一种解决方案是为我们正在构建的组件创建一个额外的包装 Blazor 组件。
然后,该包装器组件将负责从页面的 URL 中提取值(例如使用上述方法),或者可以使用 Blazor 的 JS 互操作从页面中检索数据,然后将这些值传递给实际的 Blazor完成工作的组件。
这允许原始组件继续使用参数,并允许该组件可重用。它还提供了更好的关注点分离,并且避免了以后打开已完成组件的需要,如果选择将参数直接传递给组件返回(在这种情况下可以简单地删除包装器组件)
on this github issue 上有更多关于这一切的讨论。