asp.net-mvc - 究竟是什么触发了 Blazor 组件重绘自身?

标签 asp.net-mvc blazor blazor-client-side

我有 Blazor WebAssembly 应用程序。我有一个共享模型类的父组件和子组件。当 child 更新模型上的值时, child 会重新绘制自己,但 parent 不会。那么,究竟是什么 触发了 Blazor 组件重绘自身?我找不到关于 Blazor 这个特定方面的任何文档。

我有一个 POCO 模型类。在实际应用程序中,这来自一个单独的程序集。模型/AwesomenessModel.cs:

namespace BlazorApp.Models {
    public class AwesomenessModel {
        public int? Level { get; set; }
    }
}

我的索引页。页面/Index.razor:

@page "/"

@using BlazorApp.Components
@using BlazorApp.Models

<Awesomeness AwesomenessModel="@AwesomenessModel"></Awesomeness>

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

父类。我添加了一个重绘按钮来验证内容应该已经改变。组件/Awesomeness.razor:

@using BlazorApp.Models

@if (AwesomenessModel.Level.HasValue) {
    <div>Awesomeness is @AwesomenessModel.Level.Value</div>
} else {
    for (int i = 0; i < 10; i++) {
        <AwesomenessSelector AwesomenessModel="@AwesomenessModel" Level="@i"></AwesomenessSelector>
    }
}
<div><button class="btn btn-link" @onclick="RedrawClick">Redraw</button></div>

@code {
    [Parameter]
    public AwesomenessModel AwesomenessModel { get; set; }

    private void RedrawClick() {
        this.StateHasChanged();
    }
}

对 Awesomeness 模型进行实际更改的子组件。组件/AwesomenessSelector.razor:

@using BlazorApp.Models

@if (!AwesomenessModel.Level.HasValue) {
    <div><button class="btn btn-link" @onclick="LevelClick">@Level</button></div>
}

@code {
    [Parameter]
    public AwesomenessModel AwesomenessModel { get; set; }

    [Parameter]
    public int Level { get; set; }

    private void LevelClick() {
        AwesomenessModel.Level = Level;
    }
}

当我运行应用程序并单击一个令人惊叹的级别时,该级别消失(AwesomenessSelector 组件重绘),但其余部分仍然可见并且没有“Awesomeness is...”消息(Awesomeness 组件不更新) ).如果我随后单击“重绘”按钮强制重绘 Awesomeness 组件,我会收到正确的“Awesomeness is...”消息。

我可能没有以正确的方式构建代码来让父组件自动重绘。在这种情况下我应该如何构建它?

最佳答案

子组件为 OnLevelClick 添加一个 EventCallback

@using BlazorApp.Models

@if (!AwesomenessModel.Level.HasValue) {
    <div><button class="btn btn-link" @onclick="LevelClick">@Level</button></div>
}

@code {
    [Parameter]
    public AwesomenessModel AwesomenessModel { get; set; }

    [Parameter]
    public int Level { get; set; }

    [Parameter]
    public EventCallback<string> OnLevelClick { get; set; }

    private void LevelClick() {
        AwesomenessModel.Level = Level;
        OnLevelClick.InvokeAsync();
    }
}

父组件为 OnLevelClick 添加处理程序

@using BlazorApp.Models

@if (AwesomenessModel.Level.HasValue) {
    <div>Awesomeness is @AwesomenessModel.Level.Value</div>
} else {
    for (int i = 0; i < 10; i++) {
        <AwesomenessSelector AwesomenessModel="@AwesomenessModel" Level="@i" @OnLevelClick="OnLevelClick"></AwesomenessSelector>
    }
}

@code {
    [Parameter]
    public AwesomenessModel AwesomenessModel { get; set; }

    private void OnLevelClick() {
        this.StateHasChanged();
    }
}

希望对你有帮助

关于asp.net-mvc - 究竟是什么触发了 Blazor 组件重绘自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58814284/

相关文章:

ASP.NET MVC - 从辅助方法获取 ViewContext

javascript - 调试捆绑和版本化的 JavaScript 文件

c# - Blazor : How can I Start Looping with Time ? 示例 - 2 分钟后生成一个问题

c# - BlazorNotifyAuthenticationStateChanged 不更新基于授权的元素

blazor - 如何取消blazor中的onInput事件按键值

c# - Blazor Wasm - 无法从 'method group' 转换为 'EventCallback'

c# - 无法调试客户端 blazor

c# - MVC 对 ViewPage 本身强类型化

css - Visual Studio 2013 不更新缩小的 bootstrap.css

javascript - 如何在 Blazor 中加载所有组件后加载脚本标记