从 Blazor 中的页面组件调用 MainLayout 中的方法

Posted

技术标签:

【中文标题】从 Blazor 中的页面组件调用 MainLayout 中的方法【英文标题】:Call method in MainLayout from a page component in Blazor 【发布时间】:2020-01-27 02:27:09 【问题描述】:

我有一个带有 MainLayout 页面的 Blazor 应用程序,它有一个 @Body 来加载实际的页面内容。

在我的例子中,Index.razor 被加载到 MainLayout 页面内。

有没有办法从位于父页面中的子页面(Index.razor)调用方法; MainLayout.razor?

例子:

MainLayout.razor

<div class="content">
<ul class="menu">
  <li>menu item 1</li>
</ul>

@Body

</div>

@code

    public async Task Test()
    
        await JsRuntime.InvokeAsync<object>("console.log", "test parent");
    

Index.razor

<h1>This is the index page</h1>
<button @onclick="(async () => await btn_clicked())">Call parent method</button>

@code

    // Call method in MainLayout
    public async Task btn_clicked()
    
        await parent.Test();
    

【问题讨论】:

您不再需要异步 lamda。你可以使用@onclick=btn_clicked 【参考方案1】:

您可以使用级联值和EventCallback 的组合来做到这一点。

首先,为您的Test 创建一个事件回调。为此,请在 MainLayout.razor 中添加以下代码。

EventCallback btn_clicked => EventCallback.Factory.Create(this, Test);

或者,为了确保您只创建此对象一次,您可以使用以下内容:

EventCallback _btn_clicked = EventCallback.Empty;
EventCallback btn_clicked  
    get 
        if (_btn_clicked.Equals(EventCallback.Empty))
            _btn_clicked = EventCallback.Factory.Create(this, Test);
        return _btn_clicked;
    

接下来,确保将此事件回调级联到您的身体。

<CascadingValue Value=btn_clicked >
    @Body
</CascadingValue>

现在,在您的 Index.razor 代码中,设置属性:

[CascadingParameter]
public EventCallback btn_clicked  get; set; 

【讨论】:

【参考方案2】:

谢谢。第一个答案正是我需要的,虽然我需要传入一个参数,所以它与布局相同,除了:

在 MainLayout.razor 中:

public EventCallback<string> EventName => EventCallback.Factory.Create<string>(this, MethodName);

在 Index.razor 中:

[CascadingParameter]
protected EventCallback<string> EventName  get; set; 

调用方法:

EventName.InvokeAsync("Name");

【讨论】:

这行得通,而当我调整它以采用参数时,给出的接受答案不起作用。

以上是关于从 Blazor 中的页面组件调用 MainLayout 中的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Blazor 组件调用“/Identity/Account/ExternalLogin”?

如何同时从不同的 Blazor 组件进行数据调用?

如何从 Blazor 服务器端应用程序中的 Razor 页面导航到 Blazor 组件?

如何将值从页面传递到 Blazor 中的布局?

身份剃须刀页面中的 Blazor 组件

何时在 Blazor 组件中调用 StateHasChanged()