dotnet/aspnetcore

Blazor InputSelect with multiple enabled throws NullRefException if nothing is selected

Open

#54,431 创建于 2024年3月8日

在 GitHub 查看
 (5 评论) (0 反应) (0 负责人)C# (37,933 star) (10,653 fork)batch import
area-blazorbughelp wanted

描述

Is there an existing issue for this?

  • I have searched the existing issues

Describe the bug

If there is an InputSelect in an EditForm with multiple values (via array) and nothing is selected (or everything is deselected) the following exception is thrown:

System.NullReferenceException: Object reference not set to an instance of an object.

   at Microsoft.AspNetCore.Components.BindConverter.FormatterDelegateCache.<>c__DisplayClass3_0`1.<MakeArrayFormatter>g__FormatArrayValue|0(T[] value, CultureInfo culture)

   at Microsoft.AspNetCore.Components.Forms.InputSelect`1.BuildRenderTree(RenderTreeBuilder builder)

   at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, Exception& renderFragmentException)

Assuming the following model

{
        public List<(bool, string)> CurrentRoles { get; set; } = new List<(bool, string)>();
        public string[] SelectedRoles { get; set; } = [];
}

And the following markup:

        <div class="form-group">
            <label for="roles">Roles</label>
            <InputSelect id="roles" class="form-control" @bind-Value="Model.SelectedRoles">
                @if(Model.CurrentRoles is not null)
                {
                    @foreach (var (selected, role) in Model.CurrentRoles)
                    {
                        <option selected="@selected">@role</option>
                    }
                }
            </InputSelect>
        </div>

Repo see below, markup is here: https://github.com/Tornhoof/InputMultiSelectRepro/blob/main/Components/Pages/Home.razor

Expected Behavior

No such exception

Workaround is to set the array to [] in OnInitializedAsync

Steps To Reproduce

  1. checkout https://github.com/Tornhoof/InputMultiSelectRepro
  2. make sure line 76 (Model.SelectedRoles ??= []) in Home.razor is commented
  3. Start project
  4. Deselect FirstRole in the Input Select Field

Exceptions (if any)

System.NullReferenceException: Object reference not set to an instance of an object.

   at Microsoft.AspNetCore.Components.BindConverter.FormatterDelegateCache.<>c__DisplayClass3_0`1.<MakeArrayFormatter>g__FormatArrayValue|0(T[] value, CultureInfo culture)

   at Microsoft.AspNetCore.Components.Forms.InputSelect`1.BuildRenderTree(RenderTreeBuilder builder)

   at Microsoft.AspNetCore.Components.Rendering.ComponentState.RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, Exception& renderFragmentException)

--- End of stack trace from previous location ---

   at Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()

--- End of stack trace from previous location ---

   at Microsoft.AspNetCore.Components.RenderTree.Renderer.ProcessRenderQueue()

   at Microsoft.AspNetCore.Components.RenderTree.Renderer.AddToRenderQueue(Int32 componentId, RenderFragment renderFragment)

   at Microsoft.AspNetCore.Components.ComponentBase.StateHasChanged()

   at Microsoft.AspNetCore.Components.ComponentBase.CallOnParametersSetAsync()

   at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync()

   at Microsoft.AspNetCore.Components.Rendering.ComponentState.SetDirectParameters(ParameterView parameters)

   at Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderRootComponentAsync(Int32 componentId, ParameterView initialParameters)

   at Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.BeginRenderingComponent(IComponent component, ParameterView initialParameters)

   at Microsoft.AspNetCore.Components.Endpoints.EndpointHtmlRenderer.RenderEndpointComponent(HttpContext httpContext, Type rootComponentType, ParameterView parameters, Boolean waitForQuiescence)

   at Microsoft.AspNetCore.Components.Endpoints.RazorComponentEndpointInvoker.RenderComponentCore(HttpContext context)

   at Microsoft.AspNetCore.Components.Endpoints.RazorComponentEndpointInvoker.RenderComponentCore(HttpContext context)

   at Microsoft.AspNetCore.Components.Rendering.RendererSynchronizationContext.<>c.<<InvokeAsync>b__10_0>d.MoveNext()

--- End of stack trace from previous location ---

   at Microsoft.AspNetCore.Antiforgery.Internal.AntiforgeryMiddleware.InvokeAwaited(HttpContext context)

   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)

   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

.NET Version

8.0.200

Anything else?

No response

贡献者指南