Skip to content

Commit 53c934a

Browse files
feat(QueryPageOptions): support serialization (#5840)
* chore(IFilterAction): add JsonDerivedTypeAttribute to support serialization * refactor: 增加忽略设置 * doc: 更新注释 * feat: 增加 JsonQueryPageOptionsConverter 转换器 * test: 更新单元测试 * chore: bump version 9.5.9 * revert: 撤销忽略标签 --------- Co-authored-by: Argo Zhang <[email protected]>
1 parent ad698e2 commit 53c934a

File tree

5 files changed

+359
-5
lines changed

5 files changed

+359
-5
lines changed

src/BootstrapBlazor/BootstrapBlazor.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<Version>9.5.8</Version>
4+
<Version>9.5.9</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

src/BootstrapBlazor/Components/Filters/IFilterAction.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
55

6+
using System.Text.Json.Serialization;
7+
68
namespace BootstrapBlazor.Components;
79

810
/// <summary>
911
/// IFilterAction 接口
1012
/// </summary>
13+
[JsonDerivedType(typeof(SearchFilterAction))]
1114
public interface IFilterAction
1215
{
1316
/// <summary>
Lines changed: 303 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,303 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the Apache 2.0 License
3+
// See the LICENSE file in the project root for more information.
4+
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
5+
6+
using System.Text.Json;
7+
using System.Text.Json.Serialization;
8+
9+
namespace BootstrapBlazor.Components;
10+
11+
/// <summary>
12+
/// QueryPageOptions json converter
13+
/// </summary>
14+
public class JsonQueryPageOptionsConverter : JsonConverter<QueryPageOptions>
15+
{
16+
/// <summary>
17+
/// <inheritdoc/>
18+
/// </summary>
19+
/// <param name="reader"></param>
20+
/// <param name="typeToConvert"></param>
21+
/// <param name="options"></param>
22+
/// <returns></returns>
23+
/// <exception cref="NotImplementedException"></exception>
24+
public override QueryPageOptions? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
25+
{
26+
var ret = new QueryPageOptions();
27+
if (reader.TokenType == JsonTokenType.StartObject)
28+
{
29+
while (reader.Read())
30+
{
31+
if (reader.TokenType == JsonTokenType.EndObject)
32+
{
33+
break;
34+
}
35+
if (reader.TokenType == JsonTokenType.PropertyName)
36+
{
37+
var propertyName = reader.GetString();
38+
if (propertyName == "searchText")
39+
{
40+
reader.Read();
41+
ret.SearchText = reader.GetString();
42+
}
43+
else if (propertyName == "sortName")
44+
{
45+
reader.Read();
46+
ret.SortName = reader.GetString();
47+
}
48+
else if (propertyName == "sortOrder")
49+
{
50+
reader.Read();
51+
if (Enum.TryParse<SortOrder>(reader.GetString(), out var sortOrder))
52+
{
53+
ret.SortOrder = sortOrder;
54+
}
55+
}
56+
else if (propertyName == "sortList")
57+
{
58+
reader.Read();
59+
var val = JsonSerializer.Deserialize<List<string>>(ref reader, options);
60+
if (val != null)
61+
{
62+
ret.SortList.AddRange(val);
63+
}
64+
}
65+
else if (propertyName == "advancedSortList")
66+
{
67+
reader.Read();
68+
var val = JsonSerializer.Deserialize<List<string>>(ref reader, options);
69+
if (val != null)
70+
{
71+
ret.AdvancedSortList.AddRange(val);
72+
}
73+
}
74+
else if (propertyName == "searchModel")
75+
{
76+
reader.Read();
77+
var val = JsonSerializer.Deserialize<object>(ref reader, options);
78+
if (val != null)
79+
{
80+
ret.SearchModel = val;
81+
}
82+
}
83+
else if (propertyName == "pageIndex")
84+
{
85+
reader.Read();
86+
ret.PageIndex = reader.GetInt32();
87+
}
88+
else if (propertyName == "startIndex")
89+
{
90+
reader.Read();
91+
ret.StartIndex = reader.GetInt32();
92+
}
93+
else if (propertyName == "pageItems")
94+
{
95+
reader.Read();
96+
ret.PageItems = reader.GetInt32();
97+
}
98+
else if (propertyName == "isPage")
99+
{
100+
reader.Read();
101+
ret.IsPage = reader.GetBoolean();
102+
}
103+
else if (propertyName == "isVirtualScroll")
104+
{
105+
reader.Read();
106+
ret.IsVirtualScroll = reader.GetBoolean();
107+
}
108+
else if (propertyName == "searches")
109+
{
110+
reader.Read();
111+
if (reader.TokenType == JsonTokenType.StartArray)
112+
{
113+
while (reader.Read())
114+
{
115+
if (reader.TokenType == JsonTokenType.EndArray)
116+
{
117+
break;
118+
}
119+
var val = JsonSerializer.Deserialize<SearchFilterAction>(ref reader, options);
120+
if (val != null)
121+
{
122+
ret.Searches.Add(val);
123+
}
124+
}
125+
}
126+
}
127+
else if (propertyName == "customerSearches")
128+
{
129+
reader.Read();
130+
if (reader.TokenType == JsonTokenType.StartArray)
131+
{
132+
while (reader.Read())
133+
{
134+
if (reader.TokenType == JsonTokenType.EndArray)
135+
{
136+
break;
137+
}
138+
var val = JsonSerializer.Deserialize<SearchFilterAction>(ref reader, options);
139+
if (val != null)
140+
{
141+
ret.CustomerSearches.Add(val);
142+
}
143+
}
144+
}
145+
}
146+
else if (propertyName == "advanceSearches")
147+
{
148+
reader.Read();
149+
if (reader.TokenType == JsonTokenType.StartArray)
150+
{
151+
while (reader.Read())
152+
{
153+
if (reader.TokenType == JsonTokenType.EndArray)
154+
{
155+
break;
156+
}
157+
var val = JsonSerializer.Deserialize<SearchFilterAction>(ref reader, options);
158+
if (val != null)
159+
{
160+
ret.AdvanceSearches.Add(val);
161+
}
162+
}
163+
}
164+
}
165+
else if (propertyName == "filters")
166+
{
167+
reader.Read();
168+
if (reader.TokenType == JsonTokenType.StartArray)
169+
{
170+
while (reader.Read())
171+
{
172+
if (reader.TokenType == JsonTokenType.EndArray)
173+
{
174+
break;
175+
}
176+
var val = JsonSerializer.Deserialize<SearchFilterAction>(ref reader, options);
177+
if (val != null)
178+
{
179+
ret.Filters.Add(val);
180+
}
181+
}
182+
}
183+
}
184+
else if (propertyName == "isFirstQuery")
185+
{
186+
reader.Read();
187+
ret.IsFirstQuery = reader.GetBoolean();
188+
}
189+
else if (propertyName == "isTriggerByPagination")
190+
{
191+
reader.Read();
192+
ret.IsTriggerByPagination = reader.GetBoolean();
193+
}
194+
}
195+
}
196+
}
197+
return ret;
198+
}
199+
200+
/// <summary>
201+
/// <inheritdoc/>
202+
/// </summary>
203+
/// <param name="writer"></param>
204+
/// <param name="value"></param>
205+
/// <param name="options"></param>
206+
/// <exception cref="NotImplementedException"></exception>
207+
public override void Write(Utf8JsonWriter writer, QueryPageOptions value, JsonSerializerOptions options)
208+
{
209+
writer.WriteStartObject();
210+
if (!string.IsNullOrEmpty(value.SearchText))
211+
{
212+
writer.WriteString("searchText", value.SearchText);
213+
}
214+
if (!string.IsNullOrEmpty(value.SortName))
215+
{
216+
writer.WriteString("sortName", value.SortName);
217+
}
218+
if (value.SortOrder != SortOrder.Unset)
219+
{
220+
writer.WriteString("sortOrder", value.SortOrder.ToString());
221+
}
222+
if (value.SortList.Count != 0)
223+
{
224+
writer.WritePropertyName("sortList");
225+
writer.WriteRawValue(JsonSerializer.Serialize(value.SortList, options));
226+
}
227+
if (value.AdvancedSortList.Count != 0)
228+
{
229+
writer.WritePropertyName("advancedSortList");
230+
writer.WriteRawValue(JsonSerializer.Serialize(value.AdvancedSortList, options));
231+
}
232+
if (value.SearchModel != null)
233+
{
234+
writer.WritePropertyName("searchModel");
235+
writer.WriteRawValue(JsonSerializer.Serialize(value.SearchModel, options));
236+
}
237+
if (value.PageIndex > 1)
238+
{
239+
writer.WriteNumber("pageIndex", value.PageIndex);
240+
}
241+
if (value.StartIndex != 0)
242+
{
243+
writer.WriteNumber("startIndex", value.StartIndex);
244+
}
245+
if (value.PageItems != 20)
246+
{
247+
writer.WriteNumber("pageItems", value.PageItems);
248+
}
249+
if (value.IsPage)
250+
{
251+
writer.WriteBoolean("isPage", value.IsPage);
252+
}
253+
if (value.IsVirtualScroll)
254+
{
255+
writer.WriteBoolean("isVirtualScroll", value.IsVirtualScroll);
256+
}
257+
if (value.Searches.Count != 0)
258+
{
259+
writer.WriteStartArray("searches");
260+
foreach (var filter in value.Searches)
261+
{
262+
writer.WriteRawValue(JsonSerializer.Serialize(filter, options));
263+
}
264+
writer.WriteEndArray();
265+
}
266+
if (value.CustomerSearches.Count != 0)
267+
{
268+
writer.WriteStartArray("customerSearches");
269+
foreach (var filter in value.CustomerSearches)
270+
{
271+
writer.WriteRawValue(JsonSerializer.Serialize(filter, options));
272+
}
273+
writer.WriteEndArray();
274+
}
275+
if (value.AdvanceSearches.Count != 0)
276+
{
277+
writer.WriteStartArray("advanceSearches");
278+
foreach (var filter in value.AdvanceSearches)
279+
{
280+
writer.WriteRawValue(JsonSerializer.Serialize(filter, options));
281+
}
282+
writer.WriteEndArray();
283+
}
284+
if (value.Filters.Count != 0)
285+
{
286+
writer.WriteStartArray("filters");
287+
foreach (var filter in value.Filters)
288+
{
289+
writer.WriteRawValue(JsonSerializer.Serialize(filter, options));
290+
}
291+
writer.WriteEndArray();
292+
}
293+
if (value.IsFirstQuery)
294+
{
295+
writer.WriteBoolean("isFirstQuery", value.IsFirstQuery);
296+
}
297+
if (value.IsTriggerByPagination)
298+
{
299+
writer.WriteBoolean("isTriggerByPagination", value.IsFirstQuery);
300+
}
301+
writer.WriteEndObject();
302+
}
303+
}

src/BootstrapBlazor/Options/QueryPageOptions.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace BootstrapBlazor.Components;
1010
/// <summary>
1111
/// 查询条件实体类
1212
/// </summary>
13+
[JsonConverter(typeof(JsonQueryPageOptionsConverter))]
1314
public class QueryPageOptions
1415
{
1516
/// <summary>
@@ -81,15 +82,14 @@ public class QueryPageOptions
8182
public List<IFilterAction> Searches { get; } = new(20);
8283

8384
/// <summary>
84-
/// 获得 <see cref="Table{TItem}.CustomerSearchModel"/> 中过滤条件 <see cref="Table{TItem}.SearchTemplate"/> 模板中的条件请使用 <see cref="AdvanceSearchs" />获得
85+
/// 获得 <see cref="Table{TItem}.CustomerSearchModel"/> 中过滤条件 <see cref="Table{TItem}.SearchTemplate"/> 模板中的条件请使用 <see cref="AdvanceSearches" />获得
8586
/// </summary>
8687
[Obsolete("This property is obsolete. Use CustomerSearches instead. 已过期,请使用 CustomerSearches 参数")]
8788
[ExcludeFromCodeCoverage]
88-
[JsonIgnore]
8989
public List<IFilterAction> CustomerSearchs => CustomerSearches;
9090

9191
/// <summary>
92-
/// 获得 <see cref="Table{TItem}.CustomerSearchModel"/> 中过滤条件 <see cref="Table{TItem}.SearchTemplate"/> 模板中的条件请使用 <see cref="AdvanceSearchs" />获得
92+
/// 获得 <see cref="Table{TItem}.CustomerSearchModel"/> 中过滤条件 <see cref="Table{TItem}.SearchTemplate"/> 模板中的条件请使用 <see cref="AdvanceSearches" />获得
9393
/// </summary>
9494
public List<IFilterAction> CustomerSearches { get; } = new(20);
9595

@@ -116,7 +116,6 @@ public class QueryPageOptions
116116
/// <remarks><see cref="Table{TItem}"/> 组件首次查询数据时为 true</remarks>
117117
[Obsolete("This property is obsolete. Use IsFirstQuery. 已弃用单词拼写错误,请使用 IsFirstQuery")]
118118
[ExcludeFromCodeCoverage]
119-
[JsonIgnore]
120119
public bool IsFristQuery { get => IsFirstQuery; set => IsFirstQuery = value; }
121120

122121
/// <summary>

0 commit comments

Comments
 (0)