【问题标题】:Usage of RenderComponentAsync (Blazor WebAssembly) in MVC Views / Razor Pages在 MVC 视图/Razor 页面中使用 RenderComponentAsync (Blazor WebAssembly)
【发布时间】:2020-02-18 16:54:10
【问题描述】:

我已经编辑了整个问题以便更好地理解

我的示例解决方案包含 2 个项目

  • MVC 应用程序 + Blazor 服务器
  • Razor 类库

Razor 类库有一个非常简单的组件“Awesome.razor”:

<h3>@name</h3>

<button @onclick="@(() => name = name.ToUpper())">Upper case me</button>

@code {
    string name = "Mr. Blazor";

}

MVC 应用有一个 Home/Index.cshtml:

看起来像这样:

<div id="MyComponent">
    @(await Html.RenderComponentAsync<Awesome>(RenderMode.ServerPrerendered))
</div>

如果我运行应用程序 (&lt;root&gt;/home/index)

我可以点击按钮,Awesome 组件就可以工作了。

我是否可以使用相同的技术 (Html.RenderComponentAsync) 但不使用 Blazor Server 来使用 Blazor WebAssembly?

我做了一些尝试使其工作(通过使用 Blazor WebAssembly 的模板并将其与 MVC 应用程序集成来尝试/出错),但无法使其工作。我想知道我是否做错了什么,或者RendercomponentAsync 是否只能与 Blazor Server 结合使用。

完整的源代码可以在这里找到(我没有尝试 WebAssembly): https://github.com/geeForceOne/MvcWithBlazor

更新

显然 Blazor WebAssembly 中支持 RenderComponentAsync。

通过将他的示例应用程序改编为https://github.com/geeForceOne/BlazorWebAssemblyWithPrerendering,我设法部分实现了我想要的(感谢Daniel Roth)。

我尝试了不同的尝试 n 错误并想出了这个解决方案:

在 Blazor.Client 项目的 Startup.cs 中,我注册了两个组件:

app.AddComponent<Counter>("counter");
app.AddComponent<Awesome>("awesome");

然后我创建了两个 Razor 页面 MyTest.cshtml 和 MyTest2.cshtml。虽然 MyTest.cshtml 完全符合我的要求并且工作正常:

<awesome>
    @(await Html.RenderComponentAsync<Awesome>(RenderMode.Static))
  </awesome>

<counter>
    @(await Html.RenderComponentAsync<Counter>(RenderMode.Static))
</counter>

<script src="_framework/blazor.webassembly.js"></script>

它不适用于 MyTest2.chshtml

@* To make this work, you need to 
    call
        app.AddComponent<Awesome>("awesome"); 
    before 
        app.AddComponent<Counter>("counter");
    in
        BlazorWebAssemblyWithPrerendering.Client.Startup
*@

<awesome>
    @(await Html.RenderComponentAsync<Awesome>(RenderMode.Static))
</awesome>


<script src="_framework/blazor.webassembly.js"></script>

我的问题:我是否走在正确的道路上(我需要进行哪些更改才能使其正常工作)?或者我可以按照 Daniel Roth 的原始示例以这种方式只运行一个组件吗?

【问题讨论】:

  • 在看到您的示例应用程序后,我删除了旧答案并添加了新答案...

标签: asp.net-core razor blazor blazor-server-side blazor-client-side


【解决方案1】:

看过您的应用并进行了一些调查,这是我的新答案:

您无法在浏览器上执行嵌入在 Razor Pages 应用程序或 MVC 应用程序中的 Razor 组件。换句话说,您的组件不是使用 WebAssembly 执行的。

即使您在应用中引用 Blazor WebAssembly 应用,所引用的组件也不会在使用 WebAssembly 的浏览器上运行。我在您的 MVC 解决方案中创建了默认的 Blazor WebAssembly 应用程序,并在您的 MVC 项目中添加了对它的引用。然后我在 Index.Html 中渲染了计数器,它运行良好。但是计数器组件没有在使用 WebAssembly 的浏览器上执行。

当我使用这个版本时:

@(await Html.RenderComponentAsync<MyBlazorAssembly.Pages.Counter>(RenderMode.ServerPrerendered))

Counter 组件是交互式的,递增并显示新值。 当我使用RenderMode.Server 时,也会产生相同的行为。在这两种情况下,Counter 组件都是交互式的,因为选择了RenderMode,并且该组件在服务器上预渲染。选择RenderMode.Static @时,该组件呈现为静态HTML,并且不可能进行交互性。

这正是您尝试在 WebAssembly 上运行 Awesome 组件时发生的情况。不幸的是,它被呈现为静态 Html,当您单击按钮时,不会引发任何响应......事件处理程序没有被触发,没有执行 lambda 表达式,并且没有办法将您的文本大写(您可以这样做使用纯 JavaScript)。

You can read here about the rendering modes.

拜托,如果我不够清楚,请随时问我任何问题...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2021-02-05
    • 2020-12-13
    • 2020-10-24
    • 2018-01-26
    • 2020-12-14
    • 2020-09-12
    相关资源
    最近更新 更多