Skip to content

fix: Message box is not shown in published bundle #1088

@pavel-kazutsin-leverx

Description

@pavel-kazutsin-leverx

🐛 Bug Report

I'm using in my client code message boxes to confirm the user's action and they're working well in debug mode, but in the published bundle not. Stack trace:

crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
      Unhandled exception rendering component: Arg_NoDefCTor, Microsoft.FluentUI.AspNetCore.Components.MessageBox
System.MissingMethodException: Arg_NoDefCTor, Microsoft.FluentUI.AspNetCore.Components.MessageBox
   at System.RuntimeType.CreateInstanceMono(Boolean , Boolean )
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean , Boolean )
   at System.Activator.CreateInstance(Type , Boolean , Boolean )
   at System.Activator.CreateInstance(Type , Boolean )
   at System.Activator.CreateInstance(Type )
   at Microsoft.AspNetCore.Components.DefaultComponentActivator.CreateInstance(Type )
   at Microsoft.AspNetCore.Components.ComponentFactory.InstantiateComponent(IServiceProvider , Type , IComponentRenderMode , Nullable`1 )
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.InstantiateChildComponentOnFrame(RenderTreeFrame[] , Int32 , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext& , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext& , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext& , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext& , Int32 , Int32 , Int32 , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer , RenderBatchBuilder , Int32 , ArrayRange`1 , ArrayRange`1 )
   at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder , RenderFragment , Exception& )
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderInExistingBatch(RenderQueueEntry )
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()

💻 Repro or Code Sample

TemplateConfiguration.razor

@page "/TemplateConfiguration"

@inject IDialogService DialogService

....

@code {

    private async Task ShowConfirmationAsync(string filePath)
    {
        var dialog = await DialogService.ShowConfirmationAsync("Do you confirm the deletion of this template?", "Yes", "No", "Confirmation");
        var result = await dialog.Result;

        if (!result.Cancelled)
            await DeleteTemplateAsync(filePath);
    }
}

MainLayout.razor

@inherits LayoutComponentBase
<FluentMainLayout NavMenuTitle="">
    <Header>
        <LoginDisplay/>
    </Header>
    <Body>
    @Body
    <FluentToastProvider/>
    <FluentDialogProvider/>
    </Body>
    <NavMenuContent>
        <NavigationContent/>
    </NavMenuContent>
</FluentMainLayout>

Program.cs

....

var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");

builder.Services.AddFluentUIComponents();

...

await builder.Build().RunAsync();

🤔 Expected Behavior

Message box to be shown.

image

😯 Current Behavior

Stack trace:

crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
      Unhandled exception rendering component: Arg_NoDefCTor, Microsoft.FluentUI.AspNetCore.Components.MessageBox
System.MissingMethodException: Arg_NoDefCTor, Microsoft.FluentUI.AspNetCore.Components.MessageBox
   at System.RuntimeType.CreateInstanceMono(Boolean , Boolean )
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean , Boolean )
   at System.Activator.CreateInstance(Type , Boolean , Boolean )
   at System.Activator.CreateInstance(Type , Boolean )
   at System.Activator.CreateInstance(Type )
   at Microsoft.AspNetCore.Components.DefaultComponentActivator.CreateInstance(Type )
   at Microsoft.AspNetCore.Components.ComponentFactory.InstantiateComponent(IServiceProvider , Type , IComponentRenderMode , Nullable`1 )
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.InstantiateChildComponentOnFrame(RenderTreeFrame[] , Int32 , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewComponentFrame(DiffContext& , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InitializeNewSubtree(DiffContext& , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.InsertNewFrame(DiffContext& , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.AppendDiffEntriesForRange(DiffContext& , Int32 , Int32 , Int32 , Int32 )
   at Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiffBuilder.ComputeDiff(Renderer , RenderBatchBuilder , Int32 , ArrayRange`1 , ArrayRange`1 )
   at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder , RenderFragment , Exception& )
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderInExistingBatch(RenderQueueEntry )
   at Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()

💁 Possible Solution

We have tried to reference MessageBox directly, but it doesn't work too.

 private async Task ShowConfirmationAsync(string filePath)
    {
        var messageBoxDefaultParameters = new DialogParameters<MessageBoxContent>()
        {
            Content = new MessageBoxContent()
            {
                Title = "Confirmation",
                Intent = MessageBoxIntent.Confirmation,
                IconColor = Color.Success,
                Message = "Do you confirm the deletion of this template?",
            },
            DialogType = DialogType.MessageBox,
            PrimaryAction = "Yes",
            SecondaryAction = "No",
        };
        
        DialogParameters dialogParameters = new()
        {
            DialogType = DialogType.MessageBox,
            Alignment = HorizontalAlignment.Center,
            Title = messageBoxDefaultParameters.Content.Title,
            Modal = string.IsNullOrEmpty(messageBoxDefaultParameters.SecondaryAction),
            ShowDismiss = false,
            PrimaryAction = messageBoxDefaultParameters.PrimaryAction,
            SecondaryAction = messageBoxDefaultParameters.SecondaryAction,
            Width = messageBoxDefaultParameters.Width,
            Height = messageBoxDefaultParameters.Height,
            AriaLabel = $"{messageBoxDefaultParameters.Content.Title}",
            OnDialogResult = messageBoxDefaultParameters.OnDialogResult,
        };

        var messageBox = await DialogService.ShowDialogAsync<MessageBox>(messageBoxDefaultParameters.Content, messageBoxDefaultParameters);
        
        var result = await messageBox.Result;

        if (!result.Cancelled)
            await DeleteTemplateAsync(filePath);
    }

🌍 Your Environment

  • OS & Device: Windows 11 23H2
  • Browser: latest Google Chrome
  • .NET Version 8.0.100
  • Microsoft.FluentUI.AspNetCore.Components: 4.1.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions