Blazor CascadingParameter 始终为 null

发布于 2025-01-19 23:38:43 字数 1217 浏览 3 评论 0原文

新的是Blazor,很难从我的mainlayout.razor中填充cascadingParameter

@code
{
    private Toasts Toasts { get; set; }
}
        
<Toasts @ref="@Toasts" />
    
<CascadingValue Value="Toasts">
    @Body
</CascadingValue>

and index.razor page> page:

[CascadingParameter]
public Toasts Toasts { get; set; }

public async Task PackageChanged(string value)
{
   Toasts.Something(value); //Toasts is null here
}

toasts.razor:razor:razor:razor:razor:razor:razor:razor:

@code {

    private string Message { get; set; }

    public void Something(string message)
    {
        Message = message;
        StateHasChanged();
    }
}

@Message

下面的代码令人沮丧地有效,但是我想估算一个组件(&lt; toasts /&gt; < /code>),而不是整个布局:

<CascadingValue Value="@this">
    <Toasts @ref="@Toasts" />
    @Body
</CascadingValue>

然后索引:

[CascadingParameter]
public MainLayout Layout { get; set; }

 public async Task PackageChanged(string value)
 {
      Layout.Toasts.Something(value); //this behaves as expected
 }

New to Blazor, having trouble getting a CascadingParameter to populate from my MainLayout.razor:

@code
{
    private Toasts Toasts { get; set; }
}
        
<Toasts @ref="@Toasts" />
    
<CascadingValue Value="Toasts">
    @Body
</CascadingValue>

And Index.razor page:

[CascadingParameter]
public Toasts Toasts { get; set; }

public async Task PackageChanged(string value)
{
   Toasts.Something(value); //Toasts is null here
}

And finally Toasts.razor:

@code {

    private string Message { get; set; }

    public void Something(string message)
    {
        Message = message;
        StateHasChanged();
    }
}

@Message

This code below frustratingly works, but I'd like to cascade just the one component (<Toasts />) instead of the whole layout:

<CascadingValue Value="@this">
    <Toasts @ref="@Toasts" />
    @Body
</CascadingValue>

And then index:

[CascadingParameter]
public MainLayout Layout { get; set; }

 public async Task PackageChanged(string value)
 {
      Layout.Toasts.Something(value); //this behaves as expected
 }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

作妖 2025-01-26 23:38:43

这段代码对我有用

MainLayout...部分代码

<div class="main">
        <div class="top-row px-4">
            <Toasts @ref="Toasts" />
        </div>

        @if (Toasts != null)
        {
            <CascadingValue Value="@Toasts">
                @Body
            </CascadingValue>
        }
 </div>

@code
{
    protected Toasts Toasts;

    protected override void OnAfterRender(bool firstRender)
    {
        if (firstRender)
        {
            StateHasChanged();
        }
    }
 }

下面的解决方案,我们级联对 MainLayout 的引用,然后检索对 Toasts 组件的引用,比上面的解决方案更有效,因为它不需要MainLayout 进行第二次渲染。

MainLayout...部分代码

<div class="main">
        <div class="top-row px-4">
            <Toasts @ref="Toasts" />
        </div>

         <CascadingValue Value="this">
            @Body
         </CascadingValue>     
 </div>

@code
{
    public Toasts Toasts { get; set; }
 } 

Index.razor

@page "/"

@code{
   
    [CascadingParameter]
    public MainLayout Layout { get; set; }
    
   
    protected override void OnInitialized()
    {
        // Reference the Toasts component's methods and properties
        // Note: You must not pass parameter values to the Toasts
        // component from here. You'll get a warning, or perhaps 
        // an error.
 
        Layout.Toasts.Something("Pass a message to the 
                                Something method");
    }

}

This code is working for me

MainLayout...partial code

<div class="main">
        <div class="top-row px-4">
            <Toasts @ref="Toasts" />
        </div>

        @if (Toasts != null)
        {
            <CascadingValue Value="@Toasts">
                @Body
            </CascadingValue>
        }
 </div>

@code
{
    protected Toasts Toasts;

    protected override void OnAfterRender(bool firstRender)
    {
        if (firstRender)
        {
            StateHasChanged();
        }
    }
 }

The following solution, in which we cascade a reference to MainLayout, and then retrieve a reference to the Toasts component, is a bit more effective than the one above, as it does not require the MainLayout to render a second time.

MainLayout...partial code

<div class="main">
        <div class="top-row px-4">
            <Toasts @ref="Toasts" />
        </div>

         <CascadingValue Value="this">
            @Body
         </CascadingValue>     
 </div>

@code
{
    public Toasts Toasts { get; set; }
 } 

Index.razor

@page "/"

@code{
   
    [CascadingParameter]
    public MainLayout Layout { get; set; }
    
   
    protected override void OnInitialized()
    {
        // Reference the Toasts component's methods and properties
        // Note: You must not pass parameter values to the Toasts
        // component from here. You'll get a warning, or perhaps 
        // an error.
 
        Layout.Toasts.Something("Pass a message to the 
                                Something method");
    }

}
梦屿孤独相伴 2025-01-26 23:38:43

MainLayout.razor 中的此语句不起作用

<Toasts @ref="@Toasts" />

但此语句有效且 index.razor 中的级联参数不为 null

@code
{
    private Toasts Toasts= new();
}

似乎 Blazor 不允许将元素引用作为级联参数传递,而只允许对象和其他变量。我没有您的要求的完整背景,但您可以尝试将 Toast 实现为服务。

This statement in MainLayout.razor do not work

<Toasts @ref="@Toasts" />

But this statement works and cascading parameter in index.razor is not null

@code
{
    private Toasts Toasts= new();
}

Seems that Blazor do not allow to pass element references as cascading parameter but only allows object and other variables. I do not have full context of your requirements, but you can try implementing Toasts as a service.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文