将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页面了解信息,如何实现?
答案 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")