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 8f412d54191..18b18e3d58f 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": "开启 UseSearchForm 后 SearchTemplate CustomerSearchModel CustomerSearchTemplate 均不生效",
"SearchFormIntro": "通过设置 UseSearchForm=\"true\" 开启搜索表单功能,通过 SearchItems 配置搜索表单内搜索项,适用于自定义复杂搜索条件的场景",
+ "SearchFormTips": "开启 UseSearchForm 后 SearchModel SearchTemplate CustomerSearchModel CustomerSearchTemplate 均不生效",
"SearchFormTitle": "搜索表单",
"SearchTableGroupBoxText": "搜索条件",
"SearchTableIntro": "设置 ShowSearch 显示查询组件,通过设置 SearchTemplate 模板自定义搜索 UI",
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
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/SearchForm/SearchForm.razor.cs b/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs
index 8241074c84a..edf92b4dcf6 100644
--- a/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs
+++ b/src/BootstrapBlazor/Components/SearchForm/SearchForm.razor.cs
@@ -145,26 +145,18 @@ private RenderFragment AutoGenerateTemplate(ISearchItem item)
if (OnChanged != null)
{
var filter = Items.ToFilter();
- await OnChanged.Invoke(filter);
+ await OnChanged(filter);
}
};
- return item.CreateSearchItemComponentByMetadata();
+ return item.Metadata.RenderContent() ?? item.CreateSearchItemComponentByMetadata();
}
private SearchFormLocalizerOptions? _options;
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/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/ISearchFormItemMetadata.cs b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs
index 03557144c1c..3b113530a30 100644
--- a/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs
+++ b/src/BootstrapBlazor/Components/Searches/ISearchFormItemMetadata.cs
@@ -58,4 +58,11 @@ public interface ISearchFormItemMetadata
/// Reset method
///
void Reset();
+
+ ///
+ /// 渲染自定义内容方法
+ /// Render custom content method
+ ///
+ ///
+ RenderFragment? RenderContent();
}
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 87%
rename from src/BootstrapBlazor/Components/Searches/SearchMetadataBase.cs
rename to src/BootstrapBlazor/Components/Searches/SearchFormItemMetadataBase.cs
index be00a6a3949..f00db34f771 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
{
///
/// 获得/设置 占位符文本
@@ -72,7 +72,13 @@ public abstract class SearchMetadataBase : ISearchFormItemMetadata
}
///
- ///
+ ///
///
public abstract void Reset();
+
+ ///
+ ///
+ ///
+ ///
+ public virtual RenderFragment? RenderContent() => null;
}
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
{
///
/// 获得/设置 搜索值
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)
{
-
}
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/ISearchItemExtensions.cs b/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs
index 196bb72e892..4945254a806 100644
--- a/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs
+++ b/src/BootstrapBlazor/Extensions/ISearchItemExtensions.cs
@@ -65,8 +65,8 @@ 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 =>
{
diff --git a/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs b/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs
index 96a22fe5111..4b0504b465a 100644
--- a/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs
+++ b/src/BootstrapBlazor/Extensions/IStringLocalizerExtensions.cs
@@ -35,4 +35,20 @@ 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)],
+ 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)]
+ };
}
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();
+ };
+ }
}