如何从MVC / Razor页面将参数传递到顶级服务器端Blazor组件?

时间:2019-09-11 08:13:48

标签: c# blazor blazor-server-side

将Blazor组件添加到现有MVC或Razor页面时,能够将参数传递到Blazor组件中非常有用,例如,将MVC页面的URL(例如ID)中的参数传递到组件上。 / p>

直到Core 3 Preview 9为止,使用以下语法对于服务器渲染的组件都是可能的:

@(await Html.RenderComponentAsync<NewJobComponent>(new { SaleId = Model.SaleId }))

但是从预览版9起parameters can only be passed to statically rendered Blazor components

组件仍然需要从外部MVC页面了解信息,如何实现?

2 个答案:

答案 0 :(得分:2)

更新

this blog post中所述,从.NET Core 3.1 Preview 1开始,这种用于将参数传递给所有类型的顶级组件的工具现在已经恢复。

原始答案

由于performance issues around the stateful prerendering of pages,希望暂时删除此功能。

在Blazor组件中检索URL参数和ID

希望将参数直接传递给组件的功能将返回,但是与此同时,可以通过在Blazor组件中注入NavigationManager(以前称为{{1 }})放入组件:

IUriHelper

然后您可以使用this kind of approach作为discussed here从URL中访问命名参数:

  
@Inject NavigationManager navigationManager;

如果您要从网址(例如www.mysite.com/sales/32)中获取ID,则可以执行以下操作:

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查询到组件中将限制该组件的可重用性,因为它现在依赖于URL的某种格式。

一个解决方案是为我们正在构建的组件创建一个额外的包装Blazor组件。

然后,该包装器组件将负责从页面的URL中提取值(例如,使用上述方法),或者可以使用Blazor的JS Interop从页面中检索数据,然后将这些值传递给实际的Blazor起作用的组件。

这允许原始组件继续使用参数,并使该组件可重复使用。它还可以更好地分离问题,并且避免了将参数直接传递给组件返回的选项(在这种情况下可以简单地删除包装器组件)的情况,以后无需打开完整的组件。

on this github issue上对此有更多讨论。

答案 1 :(得分:0)

ASP.NET Core 3.1在MVC视图中,您可以使用 param-将参数传递到Server / Server Prerenders组件

例如

for position, line in enumerate(pdf_text):
    lines_to_read = [1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291]
    if position in lines_to_read
        print(line,end="") 
        # I can print the text sequence at specific conditions
        pdf_file_obj.close()
        # but i've not success for use the print output as file name 
        os.rename(fullpath,+ "??" + ".pdf")