diff --git a/src/BootstrapBlazor/Components/EditorForm/EditorForm.razor.cs b/src/BootstrapBlazor/Components/EditorForm/EditorForm.razor.cs index f54352c97bf..7464d9a6da4 100644 --- a/src/BootstrapBlazor/Components/EditorForm/EditorForm.razor.cs +++ b/src/BootstrapBlazor/Components/EditorForm/EditorForm.razor.cs @@ -85,8 +85,8 @@ public partial class EditorForm : IShowLabel, IDisposable public int? LabelWidth { get; set; } /// - /// 获得/设置 列模板 设置 时本参数不生效 - /// Gets or sets Field Items Template. Not effective when is set + /// 获得/设置 绑定属性集合模板 设置 时本参数优先级高 + /// Gets or sets the field items collection template. /// [Parameter] public RenderFragment? FieldItems { get; set; } @@ -158,8 +158,8 @@ public partial class EditorForm : IShowLabel, IDisposable public List? IgnoreItems { get; set; } /// - /// 获得/设置 级联上下文绑定字段信息集合 设置此参数后 模板不生效 - /// Gets or sets Context Field Items Collection. template will not be effective if set + /// 获得/设置 绑定字段信息集合 设置此参数后 模板优先级更高 + /// Gets or sets the items collection. /// [Parameter] public IEnumerable? Items { get; set; } @@ -294,7 +294,9 @@ private List GetRenderItems() var items = new List(); if (Items != null) { - items.AddRange(Items.Where(i => !i.GetIgnore() && !string.IsNullOrEmpty(i.GetFieldName()) && FilterIgnoreItem(i))); + var editorFieldNames = new HashSet(_editorItems.Select(item => item.GetFieldName())); + items.AddRange(Items.Where(i => !editorFieldNames.Contains(i.GetFieldName()) && FilterEditorItem(i))); + items.AddRange(_editorItems.Where(FilterEditorItem)); return items; } @@ -309,6 +311,8 @@ private List GetRenderItems() return items; } + private bool FilterEditorItem(IEditorItem i) => !i.GetIgnore() && !string.IsNullOrEmpty(i.GetFieldName()) && FilterIgnoreItem(i); + private bool FilterIgnoreItem(IEditorItem item) { return IgnoreItems?.Find(i => i.Equals(item.GetFieldName(), StringComparison.OrdinalIgnoreCase)) == null; diff --git a/test/UnitTest/Components/EditorFormTest.cs b/test/UnitTest/Components/EditorFormTest.cs index 736a136e38b..57f9675cbd0 100644 --- a/test/UnitTest/Components/EditorFormTest.cs +++ b/test/UnitTest/Components/EditorFormTest.cs @@ -68,8 +68,29 @@ public void Items_Ok() pb.Add(a => a.Items, new List { new InternalTableColumn("Id", typeof(int)) { Ignore = true }, + new InternalTableColumn("Name", typeof(string)), new TableTemplateColumn() }); + + pb.Add(a => a.FieldItems, f => builder => + { + var index = 0; + builder.OpenComponent>(index++); + builder.AddAttribute(index++, nameof(EditorItem.Field), f.Name); + builder.AddAttribute(index++, nameof(EditorItem.FieldExpression), Utility.GenerateValueExpression(foo, nameof(Foo.Name), typeof(string))); + + builder.AddAttribute(index++, nameof(EditorItem.Required), true); + builder.AddAttribute(index++, nameof(EditorItem.RequiredErrorMessage), "Test"); + builder.AddAttribute(index++, nameof(EditorItem.Readonly), true); + builder.AddAttribute(index++, nameof(EditorItem.SkipValidate), false); + builder.AddAttribute(index++, nameof(EditorItem.Text), "Test-Text"); + builder.AddAttribute(index++, nameof(EditorItem.ComponentType), typeof(BootstrapInput)); + builder.AddAttribute(index++, nameof(EditorItem.ComponentParameters), new KeyValuePair[] + { + new("type", "text") + }); + builder.CloseComponent(); + }); }); }