Как сопоставить правила 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.