Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有Blazor(WASM)的MediatR通知-事件处理程序不更新UI_Blazor_Blazor Client Side_Blazor Webassembly_Mediatr_Asp.net Blazor - Fatal编程技术网

带有Blazor(WASM)的MediatR通知-事件处理程序不更新UI

带有Blazor(WASM)的MediatR通知-事件处理程序不更新UI,blazor,blazor-client-side,blazor-webassembly,mediatr,asp.net-blazor,Blazor,Blazor Client Side,Blazor Webassembly,Mediatr,Asp.net Blazor,我试图在客户端Blazor应用程序中连接MediatR,纯粹是为了处理组件之间的事件通知 该事件已发布,并由具有处理程序的单独组件拾取,但我无法从处理程序更新UI 我认为原因是MediatR调用的处理程序与UI组件使用的实例不同。这有意义吗 有人在Blazor中使用过MediatR通知吗 发布组件: @inject MediatR.IMediator _mediator <h3>Sender</h3> <button @onclick="SendNot

我试图在客户端Blazor应用程序中连接MediatR,纯粹是为了处理组件之间的事件通知

该事件已发布,并由具有处理程序的单独组件拾取,但我无法从处理程序更新UI

我认为原因是MediatR调用的处理程序与UI组件使用的实例不同。这有意义吗

有人在Blazor中使用过MediatR通知吗

发布组件:

@inject MediatR.IMediator _mediator

<h3>Sender</h3>

<button @onclick="SendNotification">Send notification</button>

@code {

    private void SendNotification()
    {
        _mediator.Publish(new MyNotification { Message = "Hello World!" });
    }

}
@using MediatR;
@implements INotificationHandler<MyNotification>;

<h3>Receiver</h3>

<p>Message: @Message</p>

@code {

    private string Message { get; set; } = "[No message]";

    public Task Handle(MyNotification notification, System.Threading.CancellationToken cancellationToken)
    {
        Message = notification.Message; // <-- THIS DOES NOT UPDATE THE UI

        return Task.CompletedTask;
    }

}
主要内容:

公共静态异步任务主(字符串[]args)
{
var builder=WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add(“应用程序”);
addScope(sp=>newHttpClient{BaseAddress=newURI(builder.HostenEnvironment.BaseAddress)});
builder.Services.AddMediatR(typeof(Program));
等待builder.Build().RunAsync();
}

你的
Blazor
应用程序应该听
MediatR
命令,一旦发生这种情况,就更新
UI
组件。为此,您需要:

  • 注意由
    MediatR
    处理程序触发的事件
  • 让您的
    Blazor
    组件订阅此事件,并使用
    StateHasChanged
    刷新UI-您可以在本文中看到“状态容器”示例
  • 也许对你有帮助。这就是一个例子。
    public class MyNotification : INotification
    {
        public string Message { get; set; }
    }
    
    public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("app");
    
        builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
        builder.Services.AddMediatR(typeof(Program));
    
        await builder.Build().RunAsync();
    }