Bla*_*ack 7 asp.net-mvc blazor-webassembly
我已经使用 .NET Core 5 Mvc 应用程序成功完成了此任务,从 Razor 页面站点提供了单独的 Blazor WebAssembly SPA。我正在使用标签助手并手动引用 _framework/blazor.web assembly.js 文件。它很好地保持了 razor 页面布局,并在 razor 页面网站内无缝地提供 SPA,并且是完全交互式的。
由于 WebAssembly 完全在浏览器中运行,因此我很好奇是否有办法对 .NET Framework 4.8 MVC 应用程序执行相同的操作。我认为 MVC 应用程序需要提供的只是访问 _framework/*.js 文件来启动 Blazor 应用程序。
Blazor 项目的目标是 .NET Standard 2.1,所以我真的不明白为什么它不可能。.NET Framework 4.8 只需要 RenderComponentAsync 的等效项。这存在吗?
小智 2
这绝对是可能的,这里有两种选择。
您可以在发布时提供 Blazor WASM 生成的整个 index.html,因为 Blazor WASM 只是静态文件。这样做的缺点是 Blazor 必须像典型的 SPA 项目一样接管整个站点。这不是人们可能喜欢的渐进方法。
另一种更接近您想要的方法是通过 .Net 6 的新 Blazor 功能。这是从 Javascript 实例化 Blazor 组件。通过这个和一些 Javascript,您甚至可以使用参数在 .Net Framework MVC 上渲染 Blazor WASM 组件。
用法有点复杂,因为它是一个低级 API,用于在其之上构建功能。
// Program.cs
builder.RootComponents.RegisterForJavaScript<Counter>(identifier: "blazor-counter");
// On your cshtml
<blazor-counter data-initial-count="@Model.InitialCount" />
// JS script to instantiate it
let containerElement = document.getElementsByTagName('blazor-counter')[0];
await Blazor.rootComponents.add(containerElement, 'blazor-counter', { initialCount: $(containerElement).data("initial-count") });
Run Code Online (Sandbox Code Playgroud)
如果您不介意尝试预览包,Blazor 团队有一个实验性包,该包基于该功能构建,支持将其封装到标准 HTML Web 组件中。
那么使用就变得如此简单。
// Program.cs
builder.RootComponents.RegisterAsCustomElement<Counter>("blazor-counter");
// On your cshtml
<blazor-counter initial-count="@Model.InitialCount" />
Run Code Online (Sandbox Code Playgroud)
唯一不支持的是预渲染。因为这需要一个 Aspnet Core 服务器作为主机。