Blazor MatAutocompletelist 抛出 System.ArgumentNullException

问题描述

我正在构建酒店服务 Web 应用程序,我想使用名为 MatAutocompleteList 的 MatBlazor 组件来选择预订的客户我在选择客户时遇到了问题,例如在屏幕上

enter image description here

删除了这个值,将其留空,然后按 Enter 应用程序抛出异常:

enter image description here

System.ArgumentNullException: Value cannot be null. (Parameter 'model')
   at Microsoft.AspNetCore.Components.Forms.FieldIdentifier..ctor(Object model,String fieldName)
   at Microsoft.AspNetCore.Components.Forms.FieldIdentifier.Create[TField](Expression`1 accessor)
   at Microsoft.AspNetCore.Components.Forms.ValidationMessage`1.OnParameteRSSet()
   at Microsoft.AspNetCore.Components.ComponentBase.CallOnParameteRSSetAsync()
   at Microsoft.AspNetCore.Components.ComponentBase.SetParametersAsync(ParameterView parameters)
   at Microsoft.AspNetCore.Components.Rendering.ComponentState.SetDirectParameters(ParameterView parameters)

组件的用法如下:

@using HotelServiceSystem.Entities
@using HotelServiceSystem.Features
@using HotelServicesystem.interfaces.Services
@using HotelServiceSystem.Core
@inject IHotelReservationService hotelReservationService
@inject IClientService clientService
@inject IRoomService roomService

<EditForm Model="@ReservationModel" OnValidSubmit="@SaveReservation">
    <FluentValidationValidator/>
    @if (ClientList != null && ClientList.Any())
    {
            <MatAutocompleteList Items="@ClientList.ToArray()" TItem="Client" CustomStringSelector="@(i => i.FirstName + " " + i.LastName)" Label="Choose client" @bind-Value="@ReservationModel.Client" FullWidth="@true" ShowClearButton="@true">
                <ItemTemplate Context="template">
                    <div style="display: flex; flex-direction: row; width: 100%;">
                        <div>@template.FirstName @template.LastName @template.PhoneNumber</div>
                    </div>
                </ItemTemplate>
            </MatAutocompleteList>
    }
    else
    {
        <p>First u need to add clients</p>
    }
    <ValidationMessage For="@(()=> ReservationModel.Client.Id)"></ValidationMessage>
    <HssInputCustom Caption="Number of guests" @bind-Value="ReservationModel.NumberOfGuests"/>
    <div class="col-12 row">
        <label class="col-2">Date From</label>
        <MatDatePicker class="form-control col-3" @bind-Value="ReservationModel.DateFrom"/>
    </div>
    <div class="col-12 row">
        <label class="col-2">Date to</label>
        <MatDatePicker class="form-control col-3" @bind-Value="ReservationModel.Dateto"/>
        <ValidationMessage For="@(() => ReservationModel.Dateto)"></ValidationMessage>
    </div>
    <div class="form-group">
        <HSSMultiSelector Selected="@_selected" NotSelected="@_notSelected"/>
    </div>
    <HssInputCustom Caption="Price" @bind-Value="ReservationModel.Price"/>
    <HssInputCustom Caption="discount" @bind-Value="ReservationModel.discount"/>
    <div class="col-12 row">
        <span class="col-2"></span>
        <input type="submit" class="form-control col-1 btn btn-primary" value="Submit"/>
    </div>
</EditForm>

@code {
    private HotelReservation ReservationModel { get; set; }
    private readonly List<MultiSelector> _selected = new List<MultiSelector>();
    private List<MultiSelector> _notSelected = new List<MultiSelector>();
    private List<Room> _selectedRooms = new List<Room>();
    private List<Room> RoomList { get; set; }
    private List<Client> ClientList { get; set; }
    private List<string> ClientIdList { get; set; }

    [Parameter]
    public EventCallback<HotelReservation> OnReservationAdd { get; set; }

    protected override async Task OnInitializedAsync()
    {
        RoomList = roomService.GetAllRoomsAsync();
        ClientList = clientService.GetAllClients();
        ReservationModel = new HotelReservation {Client = new Client()};
        _notSelected = RoomList.Select(x => new MultiSelector(x.Id.ToString(),$"Room Number : {x.RoomIdentifier}")).ToList();
        await base.OnInitializedAsync();
    }
    

    private async Task SaveReservation()
    {
        _selectedRooms = RoomList.Where(x => _selected.Any(y => y.Key == x.Id.ToString())).ToList();

        _selectedRooms.ForEach( x=> ReservationModel.Roomreservations.Add(new Roomreservation
        {
            Reservation = ReservationModel,Room = x
        }));

        await hotelReservationService.AddHotelReservationAsync(ReservationModel);
        await OnReservationAdd.InvokeAsync(ReservationModel);
        ReservationModel = new HotelReservation() {Client = new Client()};
    }
}

我绑定值的模型也已正确创建。

 private Client _selectedClient = new Client();

我不知道如何阻止用户这样做,或者我是否可以以某种方式捕获此异常。也许有人有类似的问题。非常有用的帮助!

解决方法

我确实以简单的方式解决了这个问题。我已经为我的模型客户端对象创建了属性,在这个属性中我创建了一个空检查

private Client _selectedClient
{
    get
    {
        if (ReservationModel.Client == null)
        {
            return new Client()
            {
                CompanyName = "",Email = "",FirstName = "",LastName = "",PhoneNumber = "",Id = 0
            };
        }

        return ReservationModel.Client;

    }
    set => ReservationModel.Client = value;
}

现在在代码中调用属性来设置和获取模型的值。