【问题标题】:How to load Blazor component/view into a specific div如何将 Blazor 组件/视图加载到特定的 div
【发布时间】:2019-11-15 18:50:48
【问题描述】:

在 JavaScript 中,可以将视图加载到特定容器或 div 中,例如使用 $("#div1").load("/Home/GetPartial")。如何在 Blazor 中实现相同的功能,我希望能够指定页面中的哪个 div 加载视图/组件并传递参数。

【问题讨论】:

  • 可能值得编辑问题以解决以下问题:您尝试将组件加载到另一个 Blazor 组件、MVC 页面、Razor 页面还是一般 HTML 页面的页面?这是服务器端还是客户端 Blazor?另外,您是想动态地执行此操作以响应其他一些 JS 事件,还是只是将组件加载到页面中一次?
  • @tomRedox 感谢您公开各种可能性/场景。我肯定需要 blazor 组件和 MVC 页面。也将不胜感激剃刀页面的情况。请指导。
  • @tomRedox 猜我遗漏了一些重要问题。我正在考虑客户端 blazor,我不打算使用任何 java 脚本。我只想要一种情况,我可以动态指定 Blazor 组件的 3 个 div 列中的哪个 div 使用传递给它的所需数据呈现,就像您在 java 脚本调用中附加到 div 以返回部分视图一样。跨度>
  • 我的回复回答了你的问题吗?
  • @tomRedox 您给出了很好的指导,在另一个问题中查看了您的解释,因此您指出了将 foreach 与 switch 一起使用的问题。我希望像 @code{ string theComponent = "page1";}

标签: blazor


【解决方案1】:

在 MVC 或 Razor 页面上有条件地呈现 Blazor 组件

RenderComponentAsync 方法可用于将 Blazor 组件呈现到特定位置的 MVC 或 Razor 页面上。

然后,您可以像在普通 MVC/Razor 中一样使用条件渲染来确定应该在页面上的哪个位置渲染组件。

在下面的示例中,我的 Razor 页面在其代码隐藏模型中有一个名为 CaseId 的属性,但它同样可以是在 MVC 页面的代码部分中声明并从 URL 的参数中检索的变量。


<div class='new-column'>
  @if (Model.Status = "New")
  {
    @(await Html.RenderComponentAsync<SprintCase>(RenderMode.Server,
      new { CaseId = Model.CaseId }))
  }
</div>

<div class='in-progress-column'>
  @if (Model.Status  = "In Progress")
  {
    @(await Html.RenderComponentAsync<SprintCase>(RenderMode.Server,
      new { CaseId = Model.CaseId }))
  }
</div>

<div class='complete-column'>
  @if (Model.Status = "Complete")
  {
    @(await Html.RenderComponentAsync<SprintCase>(RenderMode.Server,
      new { CaseId = Model.CaseId }))
  }
</div>

这应该适用于在首次加载时将组件渲染到正确的位置。

如果您想动态更新 MVC/Razor 页面,而不重新加载整个页面,我认为您应该能够以与通常在 MVC 中使用部分视图相同的方式进行更新,即拥有一个控制器端点它返回一个包含上面代码的局部视图,并且应该以与局部视图只是返回 HTML 相同的方式呈现。我还没有尝试过,所以我不能完全确定。

您还需要在您的 MVC 应用程序中运行 Blazor,这里有 more on that here

在另一个 Blazor 组件中有条件地呈现 Blazor 组件

这种情况要简单得多,您只需要在组件的@code 块或其他一些属性中设置一个属性即可执行开关。每当该属性发生更改时,组件应自动重新渲染,但如果没有,您可以通过调用 StateHasChanged 来提示它


<div class='new-column'>
  @if (Model.Status = "New")
  {
    <SprintCase CaseId=Model.CaseId />
  }
</div>

<div class='in-progress-column'>
  @if (Model.Status  = "In Progress")
  {
    <SprintCase CaseId=Model.CaseId />
  }
</div>

<div class='complete-column'>
  @if (Model.Status = "Complete")
  {
    <SprintCase CaseId=Model.CaseId />
  }
</div>

@code {
  private SprintCase Model { get; set; }

}

其中SprintCase 是您要有条件地呈现的 Blazor 组件的名称。

我在this answer too 中写了很多关于动态/条件组件渲染的内容。

【讨论】:

  • 组件名称是否可以根据另一个参数的值动态替换,例如 @(await Html.RenderComponentAsync(RenderMode.Server, new { CaseId = Model.CaseId }) ) new { CaseId = Model.CaseId }))
猜你喜欢
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
相关资源
最近更新 更多