How to pass parameters to a top-level server-side blazor component from an MVC/Razor page?(如何从MVC/Razor页面向顶级服务器端Blazor组件传递参数?)
问题描述
将Blazor组件添加到现有MVC或Razor页时,能够将参数传递到Blazor组件非常有用,例如,将MVC页的URL中的参数(如ID)传递到组件。
在Core 3预览版9之前,服务器呈现的组件可以使用以下语法:
@(await Html.RenderComponentAsync<NewJobComponent>(new { SaleId = Model.SaleId }))
但从预览版9开始parameters can only be passed to statically rendered Blazor components。
组件仍需要从外部MVC页面了解信息,如何实现此目的?
推荐答案
更新
此向所有类型的顶级组件传递参数的工具现已从.NET Core 3.1预览版1中恢复,如Dan Roth的this blog post中所述:
将参数传递给顶级组件
Blazor服务器应用程序现在可以将参数传递给顶级组件 在初始渲染期间。以前,您只能传递参数 添加到带有RenderMode.Static
的顶级组件。在此版本中, 和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 approachASdiscussed 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() : ""; }
of如果您要查找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 Interop从页面检索数据,然后将这些值传递给执行该工作的实际Blazor组件。
这允许原始组件继续使用参数,并允许该组件可重用。它还提供了更好的关注点分离,并避免了在直接将参数传递给组件的选项返回(在这种情况下,只需删除包装组件)时打开已完成的组件的需要。
在此on this github issue上有更多关于这方面的讨论。
这篇关于如何从MVC/Razor页面向顶级服务器端Blazor组件传递参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何从MVC/Razor页面向顶级服务器端Blazor组件传递参数?


- MoreLinq maxBy vs LINQ max + where 2022-01-01
- 如何用自己压缩一个 IEnumerable 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 输入按键事件处理程序 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01