Blazor TypeError: Невозможно прочитать свойство 'removeChild' со значением null в Object.e [as removeLogicalChild] - PullRequest
0 голосов
/ 12 февраля 2020

Я создаю компонент для двойного списка, все в порядке, но когда я отправляю, я получаю ошибку

 <EditForm Model="Model.Report" class="kt-form" OnValidSubmit="Model.OnSearch">
                <div class="modal-header">
                    <h5 class="modal-title" id="exampleModalLabel">Edit Columns</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    </button>
                </div>
                <div class="modal-body">
                    <div class="row">
                        <div class="col-md-12">
                            <Project.Components.DualListbox ReportColumns="Model.Report.ReportColumns" Id="ReportColumns" @bind-Value="@Model.Report.ReportColumns"></Project.Components.DualListbox>
                        </div>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary btn-sm" @onclick="Model.OnCloseModal"><i class="la la-close"></i> Close</button>
                    <button type="submit" class="btn btn-primary btn-sm"><i class="la la-exchange"></i> Change</button>
                </div>
            </EditForm>

Код бритвы DualListbox

@typeparam TValue
@inherits InputBase<TValue>


@if (ReportColumns != null)
{
    <select id="@Id" class="kt-dual-listbox" multiple>

        @foreach (var column in ReportColumns.OrderBy(c => c.Sort))
        {
            if (column.IsChecked == 1)
            {
                <option value="@column.Id" selected>@column.Title</option>
            }
            else
            {
                <option value="@column.Id">@column.Title</option>
            }
        }
    </select>
}

Двойной список за кодом

using Project.Models;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.JSInterop;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;

namespace Project.Components
{
    public partial class DualListbox<TValue> : InputBase<TValue>
    {
        [Parameter] public string Id { get; set; }
        [Inject] IJSRuntime JSRuntime { get; set; }
        [Parameter] public ICollection<ReportColumn> ReportColumns { get; set; }

        public DotNetObjectReference<DualListbox<TValue>> DotNetRef;
        [Parameter] public EventCallback<object> OnChanged { get; set; }
        protected override bool TryParseValueFromString(string value, out TValue result, out string validationErrorMessage)
        {
            try
            {
                if (value == "null")
                {
                    value = null;
                }
                if (typeof(TValue) == typeof(string))
                {
                    result = (TValue)(object)value;
                    validationErrorMessage = null;

                    return true;
                }
                else if (typeof(TValue) == typeof(int) || typeof(TValue) == typeof(int?))
                {
                    int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsedValue);
                    result = (TValue)(object)parsedValue;
                    validationErrorMessage = null;

                    return true;
                }

                throw new InvalidOperationException($"{GetType()} does not support the type '{typeof(TValue)}'.");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected override void OnInitialized()
        {
            base.OnInitialized();
            DotNetRef = DotNetObjectReference.Create(this);
        }

        protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            await base.OnAfterRenderAsync(firstRender);
            if (firstRender)
            {
                await JSRuntime.InvokeVoidAsync("dualListboxComponent.init", Id, DotNetRef, "Change_SelectWithFilterBase");
            }
        }

        [JSInvokable("Change_SelectWithFilterBase")]
        public void Change(string value)
        {
            try
            {
                if (value == "null")
                {
                    value = null;
                }

                var array = value.Split("#");
                if (array[0] == "add")
                {
                    int _value = int.Parse(array[1]);
                    var report = ReportColumns.Where(c => c.Id == _value).FirstOrDefault();
                    report.IsChecked = 1;
                }
                else
                {
                    int _value = int.Parse(array[1]);
                    var report = ReportColumns.Where(c => c.Id == _value).FirstOrDefault();
                    report.IsChecked = 0;
                } 

            }
            catch (Exception ex)
            {
                throw ex;
            }

            if (OnChanged.HasDelegate)
                OnChanged.InvokeAsync(value);
        }
    }
}

[2020-02-12T07: 42: 28.867Z] Ошибка: произошла ошибка при применении пакета 7. e.log @ blazor.server. js: 15 blazor.server. js: 8 Uncaught (в обещании)

TypeError: Невозможно прочитать свойство 'insertBefore' с нулевым значением в Object.s [as insertLogicalChild] (blazor.server. js: 8) в e.insertText (blazor.server. js: 8) в e.insertFrame (blazor.server. js: 8) в e.applyEdits (blazor.server. js: 8) в e.updateComponent (blazor.server. js: 8 ) в Object.t.renderBatch (blazor.server. js: 1) в e. (blazor.server. js: 15) на blazor.server. js: 15 на Object.next (blazor.server. js: 15) на blazor.server. js: 15 blazor.server. js: 15 [2020-02-12T07: 42: 28.926Z] Ошибка: System.AggregateException: произошла одна или несколько ошибок. (TypeError: Невозможно прочитать свойство 'insertBefore' со значением NULL) ---> System.InvalidOperationException: TypeError: Невозможно прочитать свойство 'insertBefore' со значением NULL в Microsoft.AspNetCore.Components.RenderTree.Renderer.InvokeRenderCompletedCallsAfterUpdateTkisis update_PontisPontisPontisPlayDisPlayDesplayDisPlayDesplayDisPlayDesplayDisPlayDesplayDisPlayDesplayDisPlayDesplayDesplayDisPlayDesplayDesplayDisplayDisPlaySlay ) --- Конец внутренней трассировки стека исключений ---

1 Ответ

0 голосов
/ 01 апреля 2020

Итак, это может быть не ваш точный ответ, но он может дать подсказку тому, кто наткнулся на этот ТАК вопрос. В моем случае это было результатом замены значка Font Awesome в тексте кнопки, а не двумя отдельными кнопками.

Это может быть связано с тем, что вы используете JSRuntime в сочетании с "report.IsChecked = 1;» синтаксис, который, как я предполагаю, изменяет состояние элемента пользовательского интерфейса на стороне клиента, который Blazor Server пытается (но не может) отслеживать.

Когда я использовал условную логику c внутри одной кнопки, чтобы поменять значок, Я получил сообщение об ошибке «Blazor TypeError: Невозможно прочитать свойство 'removeChild' of null». Этот синтаксис с использованием двух отдельных кнопок, однако, работал просто отлично:

@if (AllowAllPartners)
{
    <button @onclick="(() => AllowAllPartnersToggle())">
        <i class="far fa-check-square"></i>
    </button>
}
else
{
    <button @onclick="(() => AllowAllPartnersToggle())">
        <i class="far fa-square"></i>
    </button>
}
...