0

我正在尝试实现 Syncfusion Blazor QueryBuilder 组件来构建动态搜索过滤器。
映射到我的 C# 类模型后,我可以成功地将查询生成器规则存储到我的数据库中。但是,当我尝试将这些规则重新映射回 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);
    }

}

Syncfusion RuleModel 类

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 UI 存储和检索到 C# 模型/类中?

谢谢。

4

1 回答 1

0

我发现这个问题是由于 System.Text.Json 行为导致新创建的属性在每个属性上都有一个 ValueKind 对象。

基本上这个问题......我如何让 System.Text.Json 将对象反序列化为其原始类型?

当我切换到使用 NewtonSoft JSON.NET 反序列化 RuleModel 时,它解决了这个问题。
不知道如何使它与 System.Text.Json 一起工作 - 但现在将使用 Json.Net。

于 2022-02-03T06:47:54.290 回答