Blazor - каскадный выпадающий список с INT ID, не заполняющий данные - PullRequest
1 голос
/ 11 апреля 2020

Я заполнил ниже для, и код страны был заполнен из таблицы стран в качестве поиска на основе страны, выбранной из столбца InputSelect, «Название страны», обведено синим цветом. Однако, когда я заполняю оставшуюся часть формы и нажимаю на кнопку «Отправить», она выдает ошибки, показанные ниже.

Однако, если я ввожу тот же код вручную в столбце inputText «Код страны», то он отправляет форма.

            @using ITSM.Data
            @using ITSM.Services

            @inject ISchoolService service
            @inject IJSRuntime jsRuntime



            <div class="modal" tabindex="-1" role="dialog" id="schoolmodal">
            <div class="modal-dialog" role="document">
            <div class="modal-content">
            <div class="modal-header">
            <h5 class="modal-title">School Detail</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">×</span>
            </button>
            </div>
            <div class="modal-body">


            @if (CountryList is null)
            {
            <p><em>Loading...</em></p>
            }
            else
            {

            <h4>Schools</h4>
            <EditForm Model="@SchoolObject" OnValidSubmit="@HandleValidSubmit">
            <DataAnnotationsValidator />
            <ValidationSummary />

            <div class="form-group">
            <label for="Location" CountryCode">Country Code:</label>
            <InputSelect @bind-Value="@SchoolObject.CountryCode" class="form-control">
            <option value="0">Select</option>

            @foreach (var item in CountryList)
            {
            <option value="@item.CountryCode">@item.CountryName</option>

            }
            </InputSelect>
            &nbsp;<ValidationMessage For="@(() => @CountryObject.CountryCode)" />
            }
            </div>
            <br />



            <div class="form-group">
            <label class="col-2 font-weight-bold">Country Code:</label>
            <InputText id="CountryCode" @bind-Value="@SchoolObject.CountryCode" class="form-control" placeholder="CountryCode" />
            &nbsp;<ValidationMessage For="@(() => SchoolObject.CountryCode)" />
            </div>

Структура таблицы

            CREATE TABLE [dbo].[School](
                [SchoolID] [int] IDENTITY(1,1) NOT NULL,
                [Name] [nvarchar](50) NOT NULL,
                [Location] [nvarchar](50) NOT NULL,
                [Address] [nvarchar](50) NULL,
                [PostCode] [nvarchar](10) NULL,
                [CountryCode] [char](3) NOT NULL,
                [SchoolAdminPersonID] [int] NOT NULL,
             CONSTRAINT [PK_School] PRIMARY KEY CLUSTERED 
            (
                [SchoolID] ASC
            )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
            ) ON [PRIMARY]





            <button type="submit" class="btn btn-primary">Submit</button>
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>


            </EditForm>
            }

            </div>
            </div>

            </div>

            </div>





            @code {
            private List<CountryModel> CountryList;
            //private List<SchoolModel> SchoolList;
            [Parameter]
            public SchoolModel CountryObject { get; set; }
            [Parameter]
            public SchoolModel SchoolObject { get; set; }
            protected string schoold = string.Empty;

            [Parameter]
            public Action DataChanged { get; set; }



            private async Task Closeschoolmodal()
            {
            await jsRuntime.InvokeAsync<object>("CloseModal", "schoolmodal");
            }


            private async void HandleValidSubmit()
            {
            if (SchoolObject.SchoolID == 0)
            {
            await service.Add(SchoolObject);
            }
            else
            {
            await service.Update(SchoolObject);
            }
            await Closeschoolmodal();
            DataChanged?.Invoke();
            }


            }

Список школ

            @page "/SchoolList"

            @using ITSM.Shared
            @using ITSM
            @using ITSM.Data
            @using ITSM.Services
            @inject ISchoolService service
            @inject IJSRuntime jsRuntime

            <h1>School</h1>

            <p>Countries List.</p>

            @if (SchoolLists == null)
            {
            <p><em>Loading...</em></p>
            }
            else
            {
            <br>
            <div>
            <input type="button" data-toggle="modal" data-target="#schoolmodal" class="btn btn-primary" value="Add School" @onclick="(() => InitializeTaskObject())" />
            </div>
            <br/>

            <table class="table">
            <thead>
            <tr>
            <th>SchoolID</th>
            <th>Name</th>
            <th>Location</th>
            <th>Address</th>
            <th>PostCode</th>
            <th>CountryCode</th>
            <th>Edit</th>
            <th>Delete</th>
            </tr>
            </thead>
            <tbody>
            @foreach (var SchoolItem in SchoolLists)
            {
            <tr>
            <td>@SchoolItem.SchoolID</td>
            <td>@SchoolItem.Name</td>
            <td>@SchoolItem.Location</td>
            <td>@SchoolItem.Address</td>
            <td>@SchoolItem.PostCode</td>
            <td>@SchoolItem.CountryCode</td>
            <td><input type="button" class="btn btn-primary" @onclick="(() => PrepareForEdit(SchoolItem))" data-toggle="modal" data-target="#schoolmodal" value="Edit"></td>
            <td><input type="button" class="btn btn-danger" @onclick="(() => PrepareForDelete(SchoolItem))" data-toggle="modal" data-target="#confirmDeleteModal" value="Delete" /></td>
            </tr>
            }
            </tbody>
            </table>
            }


            <ConfirmDialog OnClick="@Delete" />
            <SchoolDetail SchoolObject=SchoolObject DataChanged="@DataChanged"></SchoolDetail>




            @code {
            List<SchoolModel> SchoolLists;
            SchoolModel SchoolObject = new SchoolModel();

            private void PrepareForEdit(SchoolModel School)
            {
            SchoolObject = School;
            }

            private void PrepareForDelete(SchoolModel School)
            {
            SchoolObject = School;
            }

            private async void Delete()
            {
            var School = await service.Delete(SchoolObject.SchoolID);
            await jsRuntime.InvokeAsync<object>("Closemodal", "confirmDeletemodal");
            SchoolLists = await service.Get();
            SchoolObject = new SchoolModel();
            StateHasChanged();
            }

            protected override async Task OnInitializedAsync()
            {
            SchoolLists = await service.Get();

            }
            private void InitializeTaskObject()
            {
            SchoolObject = new SchoolModel();
            }
            private async void DataChanged()
            {
            SchoolLists = await service.Get();
            StateHasChanged();
            }
            }

enter image description here

1 Ответ

1 голос
/ 12 апреля 2020

Прямо сейчас у вас есть и newPerson, и newPerson2, что очень запутывает. Кроме того, в вашем элементе "Код страны" Input вы фактически не привязываете его к свойству CountryCode, что означает, что newPerson2.CountryCode в InsertSchool() всегда будет нулевым.

Я бы предложил вам удалите newPerson2 и измените выпадающий список Название страны и код страны следующим образом:

<InputSelect @bind-Value="@newPerson.CountryCode">
    <option value="0">Select</option>

    @foreach (var item in Countries)
    {
        <option value="@item.CountryCode">@item.CountryName</option>
    }
</InputSelect>
<div class="col-12 row">
    <label class="col-2 font-weight-bold">Country Code:</label>
    <InputText id="CountryCode" @bind-Value="@newPerson.CountryCode" placeholder="CountryCode" />
    &nbsp;<ValidationMessage For="@(() => newPerson.CountryCode)" />
</div>

Затем в InsertSchool() вы, конечно, должны использовать newPerson: CountryCode = newPerson.CountryCode.

Я не проверял выше, но я ожидаю, что это должно работать. Это означает, что ваш выпадающий список (InputSelect) установит значение newPerson.CountryCode в зависимости от вашего выбора. Когда это произойдет, код страны Input будет обновлен с указанием newPerson.CountryCode, а также заполнением CountryCode при сохранении его в БД.

...