如何在现有的 .NET MVC 项目中启用/使用/配置 WebAssembly Blazor?

Mar*_*rko 10 asp.net-mvc blazor asp.net-core-3.0

我有一个用 .net core MVC 编写的 Web 应用程序,这是一个使用模型/视图/控制器模式的标准“老派”Web 应用程序。在这个应用程序中,我有一些复杂的表单,它们会根据用户的选择而改变。根据用户在前几个下拉列表中选择的内容加载不同的元素。目前我使用 Vue.js 成功构建了这样一个界面。所以基本上我没有 SPA 应用程序,但是当需要复杂的前端界面时,我偶尔会在整个应用程序中使用 Vue.js。

现在客户端 WebAssembly Blazor 正式推出,我想用基于 Blazor 的代码替换我用 vue.js 编写的复杂表单。我发现,说明了如何使用服务器端Blazor这样做后在这里,但我无法找到关于它的WebAssembly版本什么。

有没有人设法将客户端 - Web 程序集 Blazor 集成到现有的 MVC 项目中?如果是这样怎么办?

san*_*ete 6

我已经完成了这个工作,这真的让我度过了愉快的一周。

首先,将您的 MVC 项目更新或转换为 .Net 5.0.402。它可能适用于早期版本,但我还没有测试过。

向您的 MVC 解决方案添加 blazor Web 程序集应用项目。这是 Web 组装组件项目。

在 MVC 视图中,在您希望渲染 blazor 组件的位置添加:

@using myawesomewasmprojectnamespace.Pages

<component type="typeof(Counter)" render-mode="WebAssemblyPrerendered"/>

<script src="_framework/blazor.webassembly.js"></script>
Run Code Online (Sandbox Code Playgroud)

“@using”声明指的是 blazor Web 程序集应用项目的 Pages 目录。“typeof(Counter)”类型是指 Visual Studio 提供的默认 blazor Web 程序集应用程序项目中的 Counter.razor 组件。这当然可以替换为最终的设计组件。

在 MVC 项目的 _Layout.cshtml 中,或者<head>MVC 视图的标记所在的任何位置,包含在<head>其中包含 blazor 组件的每个页面的标记中:

<base href="/"/>
Run Code Online (Sandbox Code Playgroud)

将“Microsoft.AspNetCore.Components.WebAssembly.Server”包添加到 MVC 项目中。

在 MVC 依赖项、项目引用中添加对 blazor Web Assembly 应用程序项目的引用。

在 MVC 应用程序 Startup.cs 的“public void Configure(IApplicationBuilder app, IWebHostEnvironment env)”方法中,添加以下内容:

app.UseBlazorFrameworkFiles();
Run Code Online (Sandbox Code Playgroud)

在 blazor Web Assembly 应用程序项目 Program.cs 文件中,注释掉以下行以停止应用程序查找“ <div id="app"></div>

//builder.RootComponents.Add<App>("#app");
Run Code Online (Sandbox Code Playgroud)

最后,从 blazor Web Assembly 应用程序项目的 wwwroot 目录中删除该图标,因为它会与 MVC 发生冲突。

然后,这会将“计数器”组件添加到您的 MVC 视图中。

要将不同的组件添加到不同的视图,请将其插入:

@using myawesomewasmprojectnamespace.Pages

<component type="typeof(Myawsomecomponentnamecompletelydifferentfromanymvccontrolleroractionname)" render-mode="WebAssemblyPrerendered"/>

<script src="_framework/blazor.webassembly.js"></script>
Run Code Online (Sandbox Code Playgroud)

并启动你的 blazor 组件:

@page "/myawsomecomponentnamecompletelydifferentfromanymvccontrolleroractionname"
Run Code Online (Sandbox Code Playgroud)

我很高兴能够让这个工作正常进行,因为我已经尝试了很多年了。如果您无法使其正常工作,请给我留言,我会尽力回答任何问题。


agu*_*ars 5

要将 Blazor WASM 设置到现有项目,您需要:

  • 在 ASP.Net Core 项目中添加对 Blazor WASM 项目的引用
  • 添加对Microsoft.AspNetCore.Components.WebAssembly.Server 的包引用
  • 添加UseBlazorFrameworkFiles()到您的中间件管道中
  • 添加UseStaticFiles()到您的中间件管道中
  • 添加MapFallbackToFile到指向 Blazor WASM index.html 的端点
public void Configure(IApplicationBuilder app)
{
    if (Environment.IsDevelopment())
    {
        app.UseDeveloperExceptionPage()
            .UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error")
            .UseHsts();
    }

    app.UseHttpsRedirection()
        .UseBlazorFrameworkFiles()
        .UseStaticFiles()
        .UseRouting()
        .UseAuthentication()
        .UseAuthorization()
        .UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
               name: "default",
               pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapFallbackToFile("index.html");
        });
}

Run Code Online (Sandbox Code Playgroud)

  • 它是一个 SPA 应用程序,您无法使用标签助手在 MVC 视图中使用 Blazor WASM 组件。您可以通过添加与index.html相同的javascript和&lt;App&gt;标签来将应用程序集成到View中 (2认同)
  • 同样,它是一个在浏览器中运行的 SPA 应用程序,而不是在服务器中运行。它是用“_framework/blazor.web assembly.js”启动的。如果您想在 .cshtml 视图中托管应用程序,您需要这个脚本,就像“index.html”一样。您不需要重建应用程序。Blazor WASM 与 Razor Pages 或 MVC 无关,如果需要,它可以在 github 页面或任何提供静态页面的 http 服务器上运行。 (2认同)