Как сопоставить правила Syncfusion Blazor QueryBuilder из класса C#

Я пытаюсь реализовать компонент Syncfusion Blazor QueryBuilder для создания динамических поисковых фильтров.
Я могу успешно хранить правила построителя запросов в своей БД после сопоставления с моей моделью класса С#. Но когда я пытаюсь переназначить эти правила обратно в класс Syncfusion «RuleModel», я получаю сообщение об ошибке ниже в браузере. Похоже, это вызвано динамическими типами свойств в полях «Операция» и «Значение».
Когда я получаю сообщение об ошибке, эти свойства имеют элемент "ValueKind". Когда этого нет, он работает нормально (например, если я вручную создаю новую RuleModel())

Ошибка в Браузере при вызове метода QueryBuilderObj.SetRules()..

      Error: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot implicitly convert type 'System.Text.Json.JsonElement' to 'string'
   at CallSite.Target(Closure , CallSite , Object )
   at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
   at Syncfusion.Blazor.QueryBuilder.Internal.QueryBuilderRules`1.SetField()
   at Syncfusion.Blazor.QueryBuilder.Internal.QueryBuilderRules`1.OnParametersSetAsync()
   at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)   

Код клиента

      
<SfQueryBuilder TValue="@FilterColumns" @ref="QueryBuilderObj" MaxGroupCount=3>
    <QueryBuilderColumns>
       <QueryBuilderColumn Field="Status" Label="Status" Type="ColumnType.String"></QueryBuilderColumn>
       <QueryBuilderColumn Field="DepartmentCode" Label="DepartmentCode" Type="ColumnType.String"></QueryBuilderColumn>
    </QueryBuilderColumns>
</SfQueryBuilder>
<button type="button" @onclick="getRules">Get Rules</button>

@code {
    SfQueryBuilder<FilterColumns> QueryBuilderObj;

    public class FilterColumns
    {
        public string Status { get; set; }
        public string DepartmentCode { get; set; }
    }

    [Parameter]
    public RuleModel rules { get; set; }

    private void getRules()
    {
        QueryBuilderObj.SetRules(rules.Rules, rules.Condition);
    }

}

Класс SyncfusionRuleModel

      public class RuleModel
{
        public RuleModel();

        public string Condition { get; set; }
        public string Field { get; set; }
        public string Label { get; set; }
        public bool? Not { get; set; }
        public dynamic Operator { get; set; }
        public string Type { get; set; }
        public dynamic Value { get; set; }
        public List<RuleModel> Rules { get; set; }
}

Я воспроизвел класс syncfusion RuleModel точно так же, как указано выше, в моей модели предметной области.

Кто-нибудь успешно сохранил и извлек правила QueryBuilder из пользовательского интерфейса Blazor в модель/класс С#?

Спасибо.

1 ответ

Я понял, что эта проблема связана с поведением System.Text.Json, в результате чего вновь созданное свойство имеет объект ValueKind для каждого свойства.

В основном эта проблема... Как мне заставить System.Text.Json десериализовать объекты в их исходный тип?

Когда я переключаюсь на использование NewtonSoft JSON.NET для десериализации RuleModel, проблема решается.
Не знаю, как заставить его работать с System.Text.Json, но пока буду использовать Json.Net.

Другие вопросы по тегам