Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 52 additions & 3 deletions src/BootstrapBlazor/Attributes/AutoGenerateColumnAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,60 @@ public class AutoGenerateColumnAttribute : AutoGenerateBaseAttribute, ITableColu
set => IsVisibleWhenEdit = value ?? true;
}

bool? IEditorItem.Required { get; set; }
private bool? _required;

bool? ITableColumn.IsRequiredWhenAdd { get; set; }
/// <summary>
/// <para lang="zh">获得/设置 当前列是否必填。未显式设置时,此属性返回 false,<see cref="IEditorItem.Required"/> 接口属性保持 null 显式设置后优先于 <see cref="IsRequiredWhenAdd"/>、<see cref="IsRequiredWhenEdit"/>;未设置时按新建或编辑状态使用对应参数,Required 与对应参数均未设置时回退到 <see cref="RequiredAttribute"/> 判断</para>
/// <para lang="en">Gets or sets whether the current column is required. When not explicitly set, this property returns false while the <see cref="IEditorItem.Required"/> interface property remains null. An explicit value takes precedence over <see cref="IsRequiredWhenAdd"/> and <see cref="IsRequiredWhenEdit"/>. Otherwise, the parameter for the current add or edit operation is used; if neither Required nor that parameter is set, the required state falls back to <see cref="RequiredAttribute"/></para>
/// <para><version>11.1.0</version></para>
/// </summary>
public bool Required
{
get => _required ?? false;
set => _required = value;
}

bool? IEditorItem.Required
{
get => _required;
set => _required = value;
}

private bool? _isRequiredWhenAdd;

/// <summary>
/// <para lang="zh">获得/设置 新建时此列是否必填。仅在 <see cref="Required"/> 未显式设置时生效。未显式设置时,此属性返回 false,<see cref="ITableColumn.IsRequiredWhenAdd"/> 接口属性保持 null</para>
/// <para lang="en">Gets or sets whether the column is required when adding a new item. Applies only when <see cref="Required"/> is not explicitly set. When not explicitly set, this property returns false while the <see cref="ITableColumn.IsRequiredWhenAdd"/> interface property remains null</para>
/// </summary>
public bool IsRequiredWhenAdd
{
get => _isRequiredWhenAdd ?? false;
set => _isRequiredWhenAdd = value;
}

bool? ITableColumn.IsRequiredWhenAdd
{
get => _isRequiredWhenAdd;
set => _isRequiredWhenAdd = value;
}

private bool? _isRequiredWhenEdit;

/// <summary>
/// <para lang="zh">获得/设置 编辑时此列是否必填。仅在 <see cref="Required"/> 未显式设置时生效。未显式设置时,此属性返回 false,<see cref="ITableColumn.IsRequiredWhenEdit"/> 接口属性保持 null</para>
/// <para lang="en">Gets or sets whether the column is required when editing an item. Applies only when <see cref="Required"/> is not explicitly set. When not explicitly set, this property returns false while the <see cref="ITableColumn.IsRequiredWhenEdit"/> interface property remains null</para>
/// </summary>
public bool IsRequiredWhenEdit
{
get => _isRequiredWhenEdit ?? false;
set => _isRequiredWhenEdit = value;
}

bool? ITableColumn.IsRequiredWhenEdit { get; set; }
bool? ITableColumn.IsRequiredWhenEdit
{
get => _isRequiredWhenEdit;
set => _isRequiredWhenEdit = value;
}

/// <summary>
/// <inheritdoc/>
Expand Down
51 changes: 51 additions & 0 deletions test/UnitTest/Attributes/AutoGenerateClassTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,57 @@ public void AutoGenerateColumn_Ok()
Assert.Equal("test", attr.RequiredErrorMessage);
}

[Fact]
public void AutoGenerateColumn_Required_Ok()
{
var attr = new AutoGenerateColumnAttribute();
var editItem = (IEditorItem)attr;
var tableColumn = (ITableColumn)attr;

// 未设置时接口层保持 null 以便回退到 RequiredAttribute 或者 IsRequiredWhenAdd/IsRequiredWhenEdit
Assert.False(attr.Required);
Assert.Null(editItem.Required);
Assert.False(attr.IsRequiredWhenAdd);
Assert.Null(tableColumn.IsRequiredWhenAdd);
Assert.False(attr.IsRequiredWhenEdit);
Assert.Null(tableColumn.IsRequiredWhenEdit);

// 支持通过特性语法赋值
attr = new AutoGenerateColumnAttribute()
{
Required = true,
IsRequiredWhenAdd = true,
IsRequiredWhenEdit = true
};
editItem = attr;
tableColumn = attr;
Assert.True(attr.Required);
Assert.True(editItem.Required);
Assert.True(attr.IsRequiredWhenAdd);
Assert.True(tableColumn.IsRequiredWhenAdd);
Assert.True(attr.IsRequiredWhenEdit);
Assert.True(tableColumn.IsRequiredWhenEdit);

// 显式 false 需要与未设置区分
editItem.Required = false;
tableColumn.IsRequiredWhenAdd = false;
tableColumn.IsRequiredWhenEdit = false;
Assert.False(attr.Required);
Assert.False(editItem.Required);
Assert.False(attr.IsRequiredWhenAdd);
Assert.False(tableColumn.IsRequiredWhenAdd);
Assert.False(attr.IsRequiredWhenEdit);
Assert.False(tableColumn.IsRequiredWhenEdit);

// 通过接口设置 null 后恢复未设置状态
editItem.Required = null;
tableColumn.IsRequiredWhenAdd = null;
tableColumn.IsRequiredWhenEdit = null;
Assert.Null(editItem.Required);
Assert.Null(tableColumn.IsRequiredWhenAdd);
Assert.Null(tableColumn.IsRequiredWhenEdit);
}

class LookupService : LookupServiceBase
{
public override IEnumerable<SelectedItem>? GetItemsByKey(string? key, object? data) => null;
Expand Down
Loading