【问题标题】:Blazor Components in Razor PagesRazor 页面中的 Blazor 组件
【发布时间】:2019-09-18 06:20:29
【问题描述】:

我们有一个基本的剃须刀页面应用程序。我们想添加 Blazor 组件。通过复制 04/16 Blazor 更新视频中的步骤或使用 Blazor 文档,我们可以毫无问题地使其工作。但是,一旦我们将 Blazor 组件添加到 Razor 页面,我们所有的 asp 页面链接都将不再工作。地址栏中的 url 发生了变化,但我们仍然在同一页面上。启动文件如下:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
    });

        services.AddRazorPages()
            .AddNewtonsoftJson();

        services.AddServerSideBlazor();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseCookiePolicy();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
            endpoints.MapBlazorHub();
         });
    }

如果有人可以向我指出一个包含 Razor 页面和 Blazor 组件的多页教程,我相信我们可以解决这个问题!提前致谢!

blazor 组件工作正常。

<a asp-page="./Index">Home</a><br /> 
<div id="Counter"> @(await Html.RenderComponentAsync<Counter>()) 
<script src="~/_framework/blazor.server.js">
</script> 
</div>

Microsoft 文档状态 - 将组件集成到 Razor Pages 和 MVC 应用程序中 将组件与现有的 Razor Pages 和 MVC 应用程序一起使用。无需重写现有页面或视图即可使用 Razor 组件。当页面或视图被渲染时,组件会同时被预渲染†。 - https://docs.microsoft.com/en-us/aspnet/core/blazor/components?view=aspnetcore-3.0

【问题讨论】:

  • 我认为您必须展示“将 Blazor 组件添加到 Razor 页面”的实际含义。当您无法发布真实代码时创建一个模型(但请确保在发布之前对其进行编译)。
  • 是的,Blazor 组件能够进入 Razor 页面。请参阅下面的 sn-p。我们遇到的问题是 asp 页面链接停止工作。 Blazor 组件工作正常。 首页
    @(await Html.RenderComponentAsync())
  • 将组件集成到 Razor Pages 和 MVC 应用程序中 将组件与现有的 Razor Pages 和 MVC 应用程序一起使用。无需重写现有页面或视图即可使用 Razor 组件。当页面或视图被渲染时,组件会同时被预渲染†。 - docs.microsoft.com/en-us/aspnet/core/blazor/…
  • 我可以确认您的症状。调用 Blazor 组件后,SignalR 集线器将接管,并且路由成为 Blazor 的。这就是为什么我怀疑这是受支持的模式。
  • @Henk Holterman,通过 Razor 页面中使用的 html 帮助程序 RenderComponentAsync 可以在 Blazor 服务器端进行预渲染。我不知道启用预渲染的另一种方法。如果您希望嵌入单个 Razor 组件或整个应用程序,则必须使用 html 助手 RenderComponentAsync 方法。

标签: blazor


【解决方案1】:

要在 Razor 页面中嵌入 Razor 组件,您可以执行以下操作:

  1. 将名为 Components 的文件夹添加到您的应用程序 1.1 创建一个名为 App.razor 的组件,其中应包含: <Router AppAssembly="@typeof(MvcSandbox.Startup).Assembly" />

  2. 创建一个名为 Pages 的文件夹(在 Components 文件夹下)

  3. 将您的 Counter.razor 文件放在此文件夹中。此文件夹可能包含更多 Razor 组件。
  4. 在 Pages 文件夹中添加 _ViewImports.cshtml。它应包含:
    @using WebApplication1.Components.Shared
    @layout MainLayout
  1. 在您的组件文件夹中创建一个名为 Shared 的文件夹。此文件夹应包含两个文件:MainLayout.razor 和 NavMenu.razor。 只需从 Blazor 应用复制这些文件。

  2. Components 文件夹中添加 _ViewImports.cshtml 文件 该文件应包含:@namespace WebApplication1.Components

实际上我们在这里所做的是创建一个 Blazor 应用程序,该应用程序将在您的 MVC 或 Razor 页面中预呈现和执行。

使用方法:

  1. 在您的应用程序页面文件夹 (WebApplication1.Pages) 中添加两个文件:Components.cshtml 和 Components.cshtml.cs

1.1 Components.cshtml 可能包含:

 @page
@model WebApplication1.Pages.ComponentsModel
@{ 
    Layout = null;
}

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>WebApplication1- Components</title>
    <base href="~/" />
    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.5/css/bootstrap.min.css" />
    <link href="css/site.css" rel="stylesheet" />
</head>
<body>
    <app>@(await Html.RenderComponentAsync<WebApplication1.Components.App>())</app>

    <script src="_framework/components.server.js"></script>
</body>
</html>

1.2 Components.cshtml.cs 应该包含如下内容:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApplication1.Pages
{
    public class ComponentsModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

就是这样。如果这不起作用,则问题可能与 Startup 类中的配置错误有关。

希望这会有所帮助...

【讨论】:

  • 很棒的尝试。事实上,我执行了您的步骤,结果与我已经得到的结果相同。添加组件就可以了。 Blazor 功能有效。但是,页面外的链接仍然断开。地址栏更新但没有页面导航。只是坐在同一页上。
  • Repo 可以在 github.com/CarrotSolutions/WebApplication1.git 找到
  • 哪些链接坏了?您能否提供一个示例并生成您采取的步骤,导致地址栏更新,但没有触发导航?
  • 我可以在任何样板 MVC 或 Razor Page 默认模板中复制此场景。链接到作为 Blazor 组件的页面,所有其他页面链接将不再起作用。您甚至可以使用 Blazor 服务器端应用程序的样板模板应用程序并链接到任何 mvc 视图或 razor 页面来复制相同的情况。这必须是启动问题。删除端点.MapBlazorHub();将允许链接再次工作,但显然会破坏 Blazor 组件。
  • 是的,因为我的代码应该完美无缺,我也认为启动配置是罪魁祸首。转到 github 并删除或编辑您在此处发布的问题,并生成一个新问题,您可以在其中报告错误。在您寻求帮助时,您当前的问题不会得到 Blazor 团队的任何回复,但如果您报告了错误,则会得到不同的处理。
【解决方案2】:

打开了这个问题 - https://github.com/aspnet/AspNetCore/issues/9834。事实证明,这是一个需要 Blazor 团队解决的错误。您还想看看https://github.com/aspnet/AspNetCore/pull/10062。要立即解决,请在此问题关闭时执行拉取请求或等到下一个预览版本。

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 2021-06-07
    • 2021-11-10
    • 2021-04-22
    • 2021-11-11
    • 2020-04-09
    • 2020-03-29
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多