首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从MVC/Razor页面将参数传递给顶级服务器端blazor组件?

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

Stack Overflow用户
提问于 2019-09-11 08:13:48
回答 2查看 3.7K关注 0票数 2

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

直到Core3Preview 9之前,这对于使用以下语法呈现的服务器组件是可能的:

代码语言:javascript
复制
@(await Html.RenderComponentAsync<NewJobComponent>(new { SaleId = Model.SaleId }))

但是从Preview 9到后来的参数只能传递给静态呈现的Blazor组件。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-11 08:13:48

更新

这个将参数传递给所有类型顶级组件的工具现在回到了.NET Core3.1Preview 1中,正如Dan在这篇博客文章中讨论的那样:

将参数传递到顶层组件。 Blazor应用程序现在可以在初始呈现过程中将参数传递给顶级组件。以前,您只能使用RenderMode.Static将参数传递给顶级组件。有了这个版本,RenderMode.ServerRenderModel.ServerPrerendered现在都得到了支持。任何指定的参数值都被序列化为JSON,并包含在初始响应中。 例如,可以使用特定的当前计数预先录制计数器组件,如下所示: ( Html.RenderComponentAsync(RenderMode.ServerPrerendered,new { CurrentCount = 123 }) `

原始答案

由于页面有状态预录制周围的性能问题,这个功能已经被删除,希望是暂时的。

检索组件中的URL参数和ID

希望直接将参数传递给组件的工具将返回,但与此同时,可以通过将NavigationManager (以前称为IUriHelper)注入到组件中,从外部MVC页面的URL中检索Blazor组件中的参数:

代码语言:javascript
复制
@Inject NavigationManager navigationManager;

然后,您可以使用这种方法作为在此讨论从URL访问命名参数。

保护覆盖OnParametersSet() { var uri =新Uri(navMan.Uri);字符串myparamStr= out var myparam)?myparam.First():“;}

如果您需要的是来自URL的ID (例如,www.mysite.com/sales/32),那么您可以这样做:

代码语言:javascript
复制
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问题上有更多关于这一切的讨论。

票数 4
EN

Stack Overflow用户

发布于 2020-09-22 16:21:47

从ASP.NET视图中可以使用param-将参数传递给服务器/服务器-打印机组件

例如:

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57884875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档