Update
这种用于将参数传递给所有类型的顶级组件的功能现已从 .NET Core 3.1 Preview 1 开始回归,如中所述这篇博文 https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-core-3-1-preview-1/作者:丹·罗斯
将参数传递给顶级组件
Blazor Server 应用程序现在可以将参数传递给顶级组件
在初始渲染期间。以前只能传递参数
到顶级组件RenderMode.Static
。通过此版本,
两个都RenderMode.Server
and RenderModel.ServerPrerendered
现在
支持的。任何指定的参数值都会序列化为 JSON 和
包含在最初的响应中。
例如,您可以使用特定的预渲染计数器组件
当前计数如下:
Html.RenderComponentAsync<Counter>(RenderMode.ServerPrerendered, new {
CurrentCount = 123 })) ```
原答案
由于以下原因,此功能已被删除(希望是暂时的)页面有状态预渲染的性能问题 https://github.com/aspnet/AspNetCore/issues/12245.
检索 Blazor 组件中的 URL 参数和 ID
希望直接向组件传递参数的功能将会返回,但与此同时,可以通过注入以下内容在 Blazor 组件中检索来自外部 MVC 页面 URL 的参数:NavigationManager
(以前称为IUriHelper
) 进入组件:
@Inject NavigationManager navigationManager;
然后,您可以使用以下命令从 URL 访问命名参数这种做法 https://github.com/aspnet/AspNetCore/issues/13721#issuecomment-529019503 as 在这里讨论 https://learn-blazor.com/pages/router/#accessing-query-parameters:
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 http://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 Interop 从页面检索数据,然后将这些值传递给执行此操作的实际 Blazor 组件工作。
这允许原始组件继续使用参数并允许该组件可重用。它还提供了更好的关注点分离,并且如果选择将参数直接传递给组件返回,则无需稍后打开已完成的组件(在这种情况下,可以简单地删除包装器组件)
关于这一切还有更多讨论关于这个 github 问题 https://github.com/aspnet/AspNetCore/issues/13721.