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

2024-03-07

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

直到 Core 3 Preview 9,服务器渲染组件才可以使用以下语法:

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

但从预览版 9 开始参数只能传递给静态渲染的 Blazor 组件 https://devblogs.microsoft.com/aspnet/asp-net-core-and-blazor-updates-in-net-core-3-0-preview-9/.

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


Update

这种用于将参数传递给所有类型的顶级组件的功能现已从 .NET Core 3.1 Preview 1 开始回归,如中所述这篇博文 https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-core-3-1-preview-1/作者:丹·罗斯

将参数传递给顶级组件

Blazor Server 应用程序现在可以将参数传递给顶级组件 在初始渲染期间。以前只能传递参数 到顶级组件RenderMode.Static。通过此版本, 两个都RenderMode.Server and RenderModel.ServerPrerendered现在 支持的。任何指定的参数值都会序列化为 JSON 和 包含在最初的响应中。

例如,您可以使用特定的预渲染计数器组件 当前计数如下:

Html.RenderComponentAsync<Counter>(RenderMode.ServerPrerendered, new {
CurrentCount = 123 })) ```

原答案

由于以下原因,此功能已被删除(希望是暂时的)页面有状态预渲染的性能问题 https://github.com/aspnet/AspNetCore/issues/12245.

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

希望直接向组件传递参数的功能将会返回,但与此同时,可以通过注入以下内容在 Blazor 组件中检索来自外部 MVC 页面 URL 的参数:NavigationManager(以前称为IUriHelper) 进入组件:

@Inject NavigationManager navigationManager;

然后,您可以使用以下命令从 URL 访问命名参数这种做法 https://github.com/aspnet/AspNetCore/issues/13721#issuecomment-529019503 as 在这里讨论 https://learn-blazor.com/pages/router/#accessing-query-parameters:

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 中的 ID(例如www.mysite.com/sales/32 http://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 问题 https://github.com/aspnet/AspNetCore/issues/13721.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 MVC/Razor 页面将参数传递到顶级服务器端 blazor 组件? 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配

随机推荐