From a7716426d41fc0c5646eebce6c85df797a82ba8b Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 15:46:45 +0800 Subject: [PATCH 01/12] feat(ISearchFormItemMetadata): add RenderFragment parameter --- .../Components/Searches/ISearchFormItemMetadata.cs | 7 +++++++ .../Components/Searches/SearchMetadataBase.cs | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs index 03557144c1c..35ea79c9293 100644 --- a/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs @@ -33,6 +33,13 @@ public interface ISearchFormItemMetadata [JsonConverter(typeof(JsonStringEnumConverter))] FilterAction FilterAction { get; set; } + /// + /// 获得/设置 自定义渲染内容 + /// Gets or sets custom render content + /// + [JsonIgnore] + RenderFragment? RenderFragment { get; set; } + /// /// 根据字段名称获取过滤器实例 /// Gets the filter instance based on the field name diff --git a/src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs b/src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs index be00a6a3949..101dbc6e0db 100644 --- a/src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs +++ b/src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs @@ -41,6 +41,11 @@ public abstract class SearchMetadataBase : ISearchFormItemMetadata /// public Func? GetFilterCallback { get; set; } + /// + /// + /// + public RenderFragment? RenderFragment { get; set; } + /// /// /// @@ -72,7 +77,7 @@ public abstract class SearchMetadataBase : ISearchFormItemMetadata } /// - /// + /// /// public abstract void Reset(); } From b58c4519ac05a8eaa4db01d0f8ec370c1203ec05 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 15:47:05 +0800 Subject: [PATCH 02/12] =?UTF-8?q?refactor:=20=E7=B2=BE=E7=AE=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/SearchForm/SearchForm.razor.cs | 12 ++---------- .../Components/Table/Table.razor.Search.cs | 10 +--------- .../Extensions/IStringLocalizerExtensions.cs | 10 ++++++++++ 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs b/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs index 8241074c84a..b41964d128b 100644 --- a/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs +++ b/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs @@ -145,7 +145,7 @@ private RenderFragment AutoGenerateTemplate(ISearchItem item) if (OnChanged != null) { var filter = Items.ToFilter(); - await OnChanged.Invoke(filter); + await OnChanged(filter); } }; @@ -156,15 +156,7 @@ private RenderFragment AutoGenerateTemplate(ISearchItem item) private SearchFormLocalizerOptions GetSearchOptions() { - _options ??= SearchFormLocalizerOptions ?? new SearchFormLocalizerOptions() - { - SelectAllText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.SelectAllText)], - BooleanAllText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanAllText)], - BooleanTrueText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanTrueText)], - BooleanFalseText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanFalseText)], - NumberStartValueLabelText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.NumberStartValueLabelText)], - NumberEndValueLabelText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.NumberEndValueLabelText)] - }; + _options ??= SearchFormLocalizerOptions ?? SearchFormLocalizer.GetSearchFormLocalizerOptions(); return _options.Value; } diff --git a/src/BootstrapBlazor/Components/Table/Table.razor.Search.cs b/src/BootstrapBlazor/Components/Table/Table.razor.Search.cs index 7dcfd1ee53d..19cd502b698 100644 --- a/src/BootstrapBlazor/Components/Table/Table.razor.Search.cs +++ b/src/BootstrapBlazor/Components/Table/Table.razor.Search.cs @@ -185,15 +185,7 @@ private List GetSearchFormItems() if (SearchFormLocalizerOptions is null) { - SearchFormLocalizerOptions = new SearchFormLocalizerOptions() - { - SelectAllText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.SelectAllText)], - BooleanAllText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanAllText)], - BooleanTrueText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanTrueText)], - BooleanFalseText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.BooleanFalseText)], - NumberStartValueLabelText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.NumberStartValueLabelText)], - NumberEndValueLabelText = SearchFormLocalizer[nameof(Components.SearchFormLocalizerOptions.NumberEndValueLabelText)] - }; + SearchFormLocalizerOptions = SearchFormLocalizer.GetSearchFormLocalizerOptions(); } return GetSearchColumns().Select(i => i.ParseSearchItem(SearchFormLocalizerOptions.Value)).ToList(); } diff --git a/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs b/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs index 96a22fe5111..e2cd868557b 100644 --- a/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs +++ b/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs @@ -35,4 +35,14 @@ public static bool TryGetLocalizerString(this IStringLocalizer localizer, string } return ret; } + + public static SearchFormLocalizerOptions GetSearchFormLocalizerOptions(this IStringLocalizer localizer) => new SearchFormLocalizerOptions() + { + SelectAllText = localizer[nameof(Components.SearchFormLocalizerOptions.SelectAllText)], + BooleanAllText = localizer[nameof(Components.SearchFormLocalizerOptions.BooleanAllText)], + BooleanTrueText = localizer[nameof(Components.SearchFormLocalizerOptions.BooleanTrueText)], + BooleanFalseText = localizer[nameof(Components.SearchFormLocalizerOptions.BooleanFalseText)], + NumberStartValueLabelText = localizer[nameof(Components.SearchFormLocalizerOptions.NumberStartValueLabelText)], + NumberEndValueLabelText = localizer[nameof(Components.SearchFormLocalizerOptions.NumberEndValueLabelText)] + }; } From c1014e6f9547d62602eb06dd037ab2e1c40e5178 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 15:47:33 +0800 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=90=9C=E7=B4=A2=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/ISearchItemExtensions.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs b/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs index 196bb72e892..2d86063ce10 100644 --- a/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs @@ -65,12 +65,17 @@ public ISearchFormItemMetadata BuildSearchMetadata(SearchFormLocalizerOptions op } /// - /// 创建 搜索项的 RenderFragment 实例 - /// Creates a RenderFragment instance for the search item + /// 通过 SearchItem 实例 Metadata 创建搜索项 UI 方法 + /// Creates a search item UI method through the SearchItem instance Metadata /// public RenderFragment CreateSearchItemComponentByMetadata() => builder => { var metaData = item.Metadata; + if (metaData == null) + { + return; + } + switch (metaData) { case NumberSearchMetadata numberSearchMetadata: @@ -94,6 +99,10 @@ public RenderFragment CreateSearchItemComponentByMetadata() => builder => case StringSearchMetadata stringSearchMetadata: builder.AddStringSearchComponent(item, stringSearchMetadata); break; + default: + // 不是内置 Metadata 类型,直接渲染 Metadata 中的 RenderFragment + builder.AddContent(0, metaData.RenderFragment); + break; } }; } From aa895c43caea3bb308617660f491001d5ff8ae14 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 16:20:19 +0800 Subject: [PATCH 04/12] =?UTF-8?q?doc:=20=E8=B5=84=E6=BA=90=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor.Server/Locales/zh-CN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index 8f412d54191..99edf3b88a6 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -5065,8 +5065,8 @@ "EditModelTitle": "编辑测试数据窗口", "NamePlaceholder": "请输入姓名,50字以内", "SearchFormDesc": "使用 UseSearchForm 开启搜索表单时未提供 SearchItems 默认尝试使用设置 Searchable=\"true\"TableColumn 进行构建,可以通过 TableColumn 中的 SearchFormItemMetadata 属性定制化元数据", - "SearchFormTips": "开启 UseSearchFormSearchTemplate CustomerSearchModel CustomerSearchTemplate 均不生效", "SearchFormIntro": "通过设置 UseSearchForm=\"true\" 开启搜索表单功能,通过 SearchItems 配置搜索表单内搜索项,适用于自定义复杂搜索条件的场景", + "SearchFormTips": "开启 UseSearchFormSearchTemplate CustomerSearchModel CustomerSearchTemplate 均不生效", "SearchFormTitle": "搜索表单", "SearchTableGroupBoxText": "搜索条件", "SearchTableIntro": "设置 ShowSearch 显示查询组件,通过设置 SearchTemplate 模板自定义搜索 UI", From baa5e73b10b316c93434601b998b79c2bd205eea Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 16:33:48 +0800 Subject: [PATCH 05/12] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=94=B9=E5=9F=BA?= =?UTF-8?q?=E7=B1=BB=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Searches/DateTimeRangeSearchMetadata.cs | 2 +- .../Components/Searches/DateTimeSearchMetadata.cs | 2 +- .../Components/Searches/MultipleSelectSearchMetadata.cs | 2 +- src/BootstrapBlazor/Components/Searches/NumberSearchMetadata.cs | 2 +- .../{SearchMetadataBase.cs => SearchFormItemMetadataBase.cs} | 2 +- src/BootstrapBlazor/Components/Searches/StringSearchMetadata.cs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename src/BootstrapBlazor/Components/Searches/{SearchMetadataBase.cs => SearchFormItemMetadataBase.cs} (97%) diff --git a/src/BootstrapBlazor/Components/Searches/DateTimeRangeSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/DateTimeRangeSearchMetadata.cs index 3d52e3f8493..825e4c41e45 100644 --- a/src/BootstrapBlazor/Components/Searches/DateTimeRangeSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/DateTimeRangeSearchMetadata.cs @@ -9,7 +9,7 @@ namespace BootstrapBlazor.Components; /// 时间区间搜索元数据类 /// DateTime range search meta data class /// -public class DateTimeRangeSearchMetadata : SearchMetadataBase +public class DateTimeRangeSearchMetadata : SearchFormItemMetadataBase { /// /// 获得/设置 搜索值 diff --git a/src/BootstrapBlazor/Components/Searches/DateTimeSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/DateTimeSearchMetadata.cs index 5e526678f3a..24e77c68831 100644 --- a/src/BootstrapBlazor/Components/Searches/DateTimeSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/DateTimeSearchMetadata.cs @@ -9,7 +9,7 @@ namespace BootstrapBlazor.Components; /// 时间搜索元数据类 /// DateTime search meta data class /// -public class DateTimeSearchMetadata : SearchMetadataBase +public class DateTimeSearchMetadata : SearchFormItemMetadataBase { /// /// 获得/设置 搜索值 diff --git a/src/BootstrapBlazor/Components/Searches/MultipleSelectSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/MultipleSelectSearchMetadata.cs index 499406fb7ef..a87cfe9e418 100644 --- a/src/BootstrapBlazor/Components/Searches/MultipleSelectSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/MultipleSelectSearchMetadata.cs @@ -12,7 +12,7 @@ namespace BootstrapBlazor.Components; public class MultipleSelectSearchMetadata : SelectSearchMetadata { /// - /// + /// /// public override FilterKeyValueAction? GetFilter(string fieldName) { diff --git a/src/BootstrapBlazor/Components/Searches/NumberSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/NumberSearchMetadata.cs index c0c2bc5029f..788e86682b0 100644 --- a/src/BootstrapBlazor/Components/Searches/NumberSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/NumberSearchMetadata.cs @@ -9,7 +9,7 @@ namespace BootstrapBlazor.Components; /// 数字类型搜索元数据类 /// Number type search metadata class /// -public class NumberSearchMetadata : SearchMetadataBase +public class NumberSearchMetadata : SearchFormItemMetadataBase { /// /// 获得/设置 搜索开始值 diff --git a/src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs b/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs similarity index 97% rename from src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs rename to src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs index 101dbc6e0db..f6d825c6d56 100644 --- a/src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs +++ b/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs @@ -11,7 +11,7 @@ namespace BootstrapBlazor.Components; /// 搜索元数据基类 /// Search meta data base class /// -public abstract class SearchMetadataBase : ISearchFormItemMetadata +public abstract class SearchFormItemMetadataBase : ISearchFormItemMetadata { /// /// 获得/设置 占位符文本 diff --git a/src/BootstrapBlazor/Components/Searches/StringSearchMetadata.cs b/src/BootstrapBlazor/Components/Searches/StringSearchMetadata.cs index 3ae4cd720aa..f5121bf5913 100644 --- a/src/BootstrapBlazor/Components/Searches/StringSearchMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/StringSearchMetadata.cs @@ -9,7 +9,7 @@ namespace BootstrapBlazor.Components; /// 字符串搜索元数据类 /// String search meta data class /// -public class StringSearchMetadata : SearchMetadataBase +public class StringSearchMetadata : SearchFormItemMetadataBase { /// /// 获得/设置 搜索值 From f8499e78102dbf292f084140701aa03769311c5d Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 17:04:57 +0800 Subject: [PATCH 06/12] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20RenderConten?= =?UTF-8?q?t=20=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B8=B2=E6=9F=93=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/SearchForm/SearchForm.razor.cs | 2 +- .../Components/Searches/ISearchFormItemMetadata.cs | 5 ++--- .../Components/Searches/SearchFormItemMetadataBase.cs | 4 ++-- src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs | 9 --------- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs b/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs index b41964d128b..edf92b4dcf6 100644 --- a/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs +++ b/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs @@ -149,7 +149,7 @@ private RenderFragment AutoGenerateTemplate(ISearchItem item) } }; - return item.CreateSearchItemComponentByMetadata(); + return item.Metadata.RenderContent() ?? item.CreateSearchItemComponentByMetadata(); } private SearchFormLocalizerOptions? _options; diff --git a/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs index 35ea79c9293..87b67ef87e0 100644 --- a/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs @@ -34,11 +34,10 @@ public interface ISearchFormItemMetadata FilterAction FilterAction { get; set; } /// - /// 获得/设置 自定义渲染内容 + /// 获得/设置 自定义渲染内容方法 /// Gets or sets custom render content /// - [JsonIgnore] - RenderFragment? RenderFragment { get; set; } + RenderFragment? RenderContent(); /// /// 根据字段名称获取过滤器实例 diff --git a/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs b/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs index f6d825c6d56..91a54a5ab51 100644 --- a/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs +++ b/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs @@ -42,9 +42,9 @@ public abstract class SearchFormItemMetadataBase : ISearchFormItemMetadata public Func? GetFilterCallback { get; set; } /// - /// + /// /// - public RenderFragment? RenderFragment { get; set; } + public RenderFragment? RenderContent() => null; /// /// diff --git a/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs b/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs index 2d86063ce10..4945254a806 100644 --- a/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs +++ b/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs @@ -71,11 +71,6 @@ public ISearchFormItemMetadata BuildSearchMetadata(SearchFormLocalizerOptions op public RenderFragment CreateSearchItemComponentByMetadata() => builder => { var metaData = item.Metadata; - if (metaData == null) - { - return; - } - switch (metaData) { case NumberSearchMetadata numberSearchMetadata: @@ -99,10 +94,6 @@ public RenderFragment CreateSearchItemComponentByMetadata() => builder => case StringSearchMetadata stringSearchMetadata: builder.AddStringSearchComponent(item, stringSearchMetadata); break; - default: - // 不是内置 Metadata 类型,直接渲染 Metadata 中的 RenderFragment - builder.AddContent(0, metaData.RenderFragment); - break; } }; } From be383dab8e512031aa72d6a2c2a0bfdd14275aeb Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 19:40:06 +0800 Subject: [PATCH 07/12] feat(ISearchFormItemMetadata): add RenderContent method --- .../Components/Searches/ISearchFormItemMetadata.cs | 13 +++++++------ .../Searches/SearchFormItemMetadataBase.cs | 11 ++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs index 87b67ef87e0..3b113530a30 100644 --- a/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs +++ b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs @@ -33,12 +33,6 @@ public interface ISearchFormItemMetadata [JsonConverter(typeof(JsonStringEnumConverter))] FilterAction FilterAction { get; set; } - /// - /// 获得/设置 自定义渲染内容方法 - /// Gets or sets custom render content - /// - RenderFragment? RenderContent(); - /// /// 根据字段名称获取过滤器实例 /// Gets the filter instance based on the field name @@ -64,4 +58,11 @@ public interface ISearchFormItemMetadata /// Reset method /// void Reset(); + + /// + /// 渲染自定义内容方法 + /// Render custom content method + /// + /// + RenderFragment? RenderContent(); } diff --git a/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs b/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs index 91a54a5ab51..f00db34f771 100644 --- a/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs +++ b/src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs @@ -41,11 +41,6 @@ public abstract class SearchFormItemMetadataBase : ISearchFormItemMetadata /// public Func? GetFilterCallback { get; set; } - /// - /// - /// - public RenderFragment? RenderContent() => null; - /// /// /// @@ -80,4 +75,10 @@ public abstract class SearchFormItemMetadataBase : ISearchFormItemMetadata /// /// public abstract void Reset(); + + /// + /// + /// + /// + public virtual RenderFragment? RenderContent() => null; } From 25ef693ee5c629ebcb56eedd0ed7fd9ba12dcb01 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 19:40:12 +0800 Subject: [PATCH 08/12] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/SearchFormTest.cs | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/UnitTest/Components/SearchFormTest.cs b/test/UnitTest/Components/SearchFormTest.cs index 8e251f6b01e..99c955aefcb 100644 --- a/test/UnitTest/Components/SearchFormTest.cs +++ b/test/UnitTest/Components/SearchFormTest.cs @@ -270,4 +270,40 @@ public void Reset_Ok() // Metadata 为空时不报错 item.Reset(); } + + [Fact] + public async Task CustomMetadata_Ok() + { + var filterKeyValueAction = new FilterKeyValueAction(); + var cut = Context.Render(pb => + { + pb.Add(a => a.OnChanged, action => + { + filterKeyValueAction = action; + return Task.CompletedTask; + }); + pb.Add(a => a.Items, new List() + { + new SearchItem(nameof(Foo.Name), typeof(string), "Name") + { + Metadata = new CustomeMetadata() { Value = "foo-name-value" } + } + }); + }); + + cut.Contains("value=\"foo-name-value\""); + } + + class CustomeMetadata : StringSearchMetadata + { + public override RenderFragment? RenderContent() => builder => + { + builder.OpenComponent>(0); + builder.AddAttribute(10, nameof(BootstrapInput<>.Value), Value); + builder.AddAttribute(20, nameof(BootstrapInput<>.OnValueChanged), ValueChangedHandler); + builder.AddAttribute(30, nameof(BootstrapInput<>.ShowLabel), true); + builder.AddAttribute(60, nameof(BootstrapInput<>.SkipValidate), true); + builder.CloseComponent(); + }; + } } From 2ea00e382d7da6473abfe6d9bc96296c738d3f92 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 19:42:20 +0800 Subject: [PATCH 09/12] chore: bump version 10.4.2 --- src/BootstrapBlazor/BootstrapBlazor.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 05fb07de626..3a92c5156d9 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 10.4.2-beta02 + 10.4.2 From 78bfacd47b68fe6e2aa64c9b22edd190ecb7d448 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 19:57:34 +0800 Subject: [PATCH 10/12] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Samples/Table/TablesSearch.razor | 84 +++++++++---------- src/BootstrapBlazor.Server/Locales/en-US.json | 2 +- src/BootstrapBlazor.Server/Locales/zh-CN.json | 2 +- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/Table/TablesSearch.razor b/src/BootstrapBlazor.Server/Components/Samples/Table/TablesSearch.razor index 2a3838689a0..950f1be464b 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Table/TablesSearch.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/Table/TablesSearch.razor @@ -34,48 +34,6 @@ - -
-
    -
  • @((MarkupString)Localizer["SearchTableLi1"].Value)
  • -
  • @((MarkupString)Localizer["SearchTableLi2"].Value)
  • -
  • @((MarkupString)Localizer["SearchTableLi3"].Value)
  • -
- @((MarkupString)Localizer["AutoHeightIntro"].Value) -
-
- - - - - - - - - -
-
- -
-
- -
-
-
-
-
-
-
- @@ -124,6 +82,48 @@ + +
+
    +
  • @((MarkupString)Localizer["SearchTableLi1"].Value)
  • +
  • @((MarkupString)Localizer["SearchTableLi2"].Value)
  • +
  • @((MarkupString)Localizer["SearchTableLi3"].Value)
  • +
+ @((MarkupString)Localizer["AutoHeightIntro"].Value) +
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+
+
+
+
+
+ diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index 8900002c188..27ca58ad6e4 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -5066,7 +5066,7 @@ "NamePlaceholder": "Please enter your name within 50 characters", "SearchFormDesc": "When UseSearchForm is enabled and SearchItems is not provided, it will default to using TableColumn with Searchable=\"true\". You can customize the metadata through the SearchFormItemMetadata property in TableColumn", "SearchFormIntro": "Enable the search form feature by setting UseSearchForm=\"true\", and configure the search items within the form using SearchItems, suitable for scenarios with custom complex search conditions", - "SearchFormTips": "Enabling UseSearchForm will prevent SearchTemplate, CustomerSearchModel, and CustomerSearchTemplate from taking effect.", + "SearchFormTips": "Enabling UseSearchForm will prevent SearchModel SearchTemplate, CustomerSearchModel, and CustomerSearchTemplate from taking effect.", "SearchFormTitle": "Search Form", "SearchTableGroupBoxText": "Search Criteria", "SearchTableIntro": "Set ShowSearch to display the query component, customize the search UI by setting the SearchTemplate template", diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index 99edf3b88a6..18b18e3d58f 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -5066,7 +5066,7 @@ "NamePlaceholder": "请输入姓名,50字以内", "SearchFormDesc": "使用 UseSearchForm 开启搜索表单时未提供 SearchItems 默认尝试使用设置 Searchable=\"true\"TableColumn 进行构建,可以通过 TableColumn 中的 SearchFormItemMetadata 属性定制化元数据", "SearchFormIntro": "通过设置 UseSearchForm=\"true\" 开启搜索表单功能,通过 SearchItems 配置搜索表单内搜索项,适用于自定义复杂搜索条件的场景", - "SearchFormTips": "开启 UseSearchFormSearchTemplate CustomerSearchModel CustomerSearchTemplate 均不生效", + "SearchFormTips": "开启 UseSearchFormSearchModel SearchTemplate CustomerSearchModel CustomerSearchTemplate 均不生效", "SearchFormTitle": "搜索表单", "SearchTableGroupBoxText": "搜索条件", "SearchTableIntro": "设置 ShowSearch 显示查询组件,通过设置 SearchTemplate 模板自定义搜索 UI", From d9d1ce237713aa8a86e3bdc1117a437e2a01aca9 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 19:57:43 +0800 Subject: [PATCH 11/12] =?UTF-8?q?doc:=20=E5=A2=9E=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/IStringLocalizerExtensions.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs b/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs index e2cd868557b..4b0504b465a 100644 --- a/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs +++ b/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs @@ -36,6 +36,12 @@ public static bool TryGetLocalizerString(this IStringLocalizer localizer, string return ret; } + /// + /// 通过资源文件获取 SearchFormLocalizerOptions 实例 + /// Get the SearchFormLocalizerOptions instance from the resource file + /// + /// + /// public static SearchFormLocalizerOptions GetSearchFormLocalizerOptions(this IStringLocalizer localizer) => new SearchFormLocalizerOptions() { SelectAllText = localizer[nameof(Components.SearchFormLocalizerOptions.SelectAllText)], From 2450485b90729a5b17b23a71b8e86e54263d3c05 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 22 Mar 2026 19:58:02 +0800 Subject: [PATCH 12/12] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=20SearchFo?= =?UTF-8?q?rm=20=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Dialog/SearchDialog.razor | 6 ++++-- src/BootstrapBlazor/Components/Table/Table.razor | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/BootstrapBlazor/Components/Dialog/SearchDialog.razor b/src/BootstrapBlazor/Components/Dialog/SearchDialog.razor index b7e6b419316..6de5a36837f 100644 --- a/src/BootstrapBlazor/Components/Dialog/SearchDialog.razor +++ b/src/BootstrapBlazor/Components/Dialog/SearchDialog.razor @@ -4,8 +4,10 @@ @if (UseSearchForm) { - + @RenderButtons diff --git a/src/BootstrapBlazor/Components/Table/Table.razor b/src/BootstrapBlazor/Components/Table/Table.razor index d36ae847447..e5b4eb50373 100644 --- a/src/BootstrapBlazor/Components/Table/Table.razor +++ b/src/BootstrapBlazor/Components/Table/Table.razor @@ -1100,7 +1100,9 @@ @if (UseSearchForm) { - }