我有一个Blazor应用程序,该应用程序的页面为MainLayout
,其中有一个@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();
}
}
答案 0 :(得分:2)
您可以结合使用级联值和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; }
答案 1 :(得分:0)
谢谢。第一个答案正是我需要的,尽管我需要传递一个参数,所以它与布局相同,除了:
在MainLayout.razor中:
public EventCallback<string> EventName => EventCallback.Factory.Create<string>(this, MethodName);
在Index.razor中:
[CascadingParameter]
protected EventCallback<string> EventName { get; set; }
调用方法:
EventName.InvokeAsync("Name");