当向现有的MVC或Razor页面添加Blazor组件时,能够将参数传递到Blazor组件中是非常有用的,例如,将MVC页面的URL (例如ID)中的参数传递给组件。
直到Core3Preview 9之前,这对于使用以下语法呈现的服务器组件是可能的:
@(await Html.RenderComponentAsync<NewJobComponent>(new { SaleId = Model.SaleId }))但是从Preview 9到后来的参数只能传递给静态呈现的Blazor组件。。
组件仍然需要了解外部MVC页面的信息,这是如何实现的?
发布于 2019-09-11 08:13:48
更新
这个将参数传递给所有类型顶级组件的工具现在回到了.NET Core3.1Preview 1中,正如Dan在这篇博客文章中讨论的那样:
将参数传递到顶层组件。 Blazor应用程序现在可以在初始呈现过程中将参数传递给顶级组件。以前,您只能使用
RenderMode.Static将参数传递给顶级组件。有了这个版本,RenderMode.Server和RenderModel.ServerPrerendered现在都得到了支持。任何指定的参数值都被序列化为JSON,并包含在初始响应中。 例如,可以使用特定的当前计数预先录制计数器组件,如下所示: ( Html.RenderComponentAsync(RenderMode.ServerPrerendered,new { CurrentCount = 123 }) `
原始答案
由于页面有状态预录制周围的性能问题,这个功能已经被删除,希望是暂时的。
检索组件中的URL参数和ID
希望直接将参数传递给组件的工具将返回,但与此同时,可以通过将NavigationManager (以前称为IUriHelper)注入到组件中,从外部MVC页面的URL中检索Blazor组件中的参数:
@Inject NavigationManager navigationManager;保护覆盖OnParametersSet() { var uri =新Uri(navMan.Uri);字符串myparamStr= 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 Interop从页面检索数据,然后将这些值传递给实际的完成工作的Blazor组件。
这允许原始组件继续使用参数,并允许该组件可重用。它还提供了更好的关注点分离,并避免了以后在选择直接将参数传递给组件返回(在这种情况下包装器组件可以被删除)时打开一个已完成的组件的需要。
在这个关于github问题上有更多关于这一切的讨论。
发布于 2020-09-22 16:21:47
从ASP.NET视图中可以使用param-将参数传递给服务器/服务器-打印机组件
例如:
<div class="mb-4">
<component type="typeof(TestStorables)"
render-mode="Server"
param-UserId="@Model.UserId"
param-AccountId="@Model.AccountId"
param-Environment="@Model.Environment"
param-Title="@Convert.ToString("Test Storable")"
param-PartitionKey="@Model.AccountId"
param-Limit="10" />
</div>https://stackoverflow.com/questions/57884875
复制相似问题