Skip to content
2 changes: 1 addition & 1 deletion src/BootstrapBlazor/BootstrapBlazor.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Razor">

<PropertyGroup>
<Version>10.1.5-beta05</Version>
<Version>10.2.0</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
12 changes: 7 additions & 5 deletions src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1086,9 +1086,9 @@ async Task<bool> DeleteItemsAsync()
// 由于数据删除导致页码会改变,尤其是最后一页
// 重新计算页码
// https://gitee.com/LongbowEnterprise/BootstrapBlazor/issues/I1UJSL
PageIndex = Math.Max(1, Math.Min(PageIndex, int.Parse(Math.Ceiling((TotalCount - SelectedRows.Count) * 1d / _pageItems).ToString())));
var items = PageItemsSource.Where(item => item >= (TotalCount - SelectedRows.Count));
if (items.Any())
PageIndex = GetSafePageIndex();
var items = PageItemsSource.Where(item => item >= (TotalCount - SelectedRows.Count)).ToList();
if (items.Count > 0)
{
_pageItems = Math.Min(_pageItems, items.Min());
}
Expand Down Expand Up @@ -1150,16 +1150,18 @@ private void QueryDynamicItems(QueryPageOptions queryOption, IDynamicObjectConte
{
TotalCount = items.Count();
PageCount = (int)Math.Ceiling(TotalCount * 1.0 / Math.Max(1, _pageItems));
PageIndex = Math.Max(1, Math.Min(PageIndex, int.Parse(Math.Ceiling((TotalCount - SelectedRows.Count) * 1d / _pageItems).ToString())));
PageIndex = GetSafePageIndex();
items = items.Skip((PageIndex - 1) * _pageItems).Take(_pageItems);
}
QueryItems = items.Cast<TItem>();
QueryItems = items.Cast<TItem>().ToList();

// 重置选中行
ResetSelectedRows(QueryItems);
}
}

private int GetSafePageIndex() => Math.Max(1, Math.Min(PageIndex, (int)Math.Ceiling((TotalCount - SelectedRows.Count) * 1.0 / _pageItems)));

private async Task ExecuteExportAsync(Func<Task<bool>> callback)
{
if (BeforeExportCallback != null)
Expand Down
34 changes: 31 additions & 3 deletions src/BootstrapBlazor/Components/Validate/ValidateBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ protected virtual bool IsRequired() => ShowRequired ?? FieldIdentifier
.Build();

/// <summary>
/// SetParametersAsync 方法
/// <inheritdoc/>
/// </summary>
/// <param name="parameters"></param>
/// <returns></returns>
Expand All @@ -274,7 +274,7 @@ public override Task SetParametersAsync(ParameterView parameters)
}

/// <summary>
/// OnInitialized 方法
/// <inheritdoc/>
/// </summary>
protected override void OnInitialized()
{
Expand All @@ -291,7 +291,7 @@ protected override void OnInitialized()
}

/// <summary>
/// OnParametersSet 方法
/// <inheritdoc/>
/// </summary>
protected override void OnParametersSet()
{
Expand Down Expand Up @@ -326,6 +326,26 @@ protected override void OnParametersSet()
}
}

/// <summary>
/// <inheritdoc/>
/// </summary>
/// <returns></returns>
protected override bool ShouldRender()
{
if (ValidateForm == null)
{
return true;
}

if (_shouldRender is true)
{
_shouldRender = false;
return true;
}

return _shouldRender ?? true;
}

/// <summary>
/// <inheritdoc/>
/// </summary>
Expand All @@ -346,6 +366,11 @@ protected override async Task OnAfterRenderAsync(bool firstRender)
await ShowValidResult();
}
}

if (_shouldRender == false)
{
_shouldRender = null;
}
}

private string? _defaultRequiredErrorMessage;
Expand Down Expand Up @@ -456,6 +481,8 @@ private void ValidateType(ValidationContext context, List<ValidationResult> resu
}
}

private bool? _shouldRender = null;

/// <summary>
/// 显示/隐藏验证结果方法
/// </summary>
Expand All @@ -480,6 +507,7 @@ public virtual Task ToggleMessage(IReadOnlyCollection<ValidationResult> results)
}

// 必须刷新一次 UI 保证状态正确
_shouldRender = true;
StateHasChanged();
return Task.CompletedTask;
}
Expand Down
10 changes: 5 additions & 5 deletions test/UnitTest/Components/ValidateFormTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -542,9 +542,9 @@ public async Task ValidateFromCode_Ok()
});
Assert.Contains("form-control valid", cut.Markup);

var form = cut.Instance;
await cut.InvokeAsync(() => form.Validate());
Assert.Contains("form-control valid is-invalid", cut.Markup);
var form = cut.Find("form");
await cut.InvokeAsync(() => form.Submit());
Assert.Contains("form-control invalid is-invalid", cut.Markup);
}

[Fact]
Expand All @@ -566,7 +566,7 @@ public async Task Validate_Service_Ok()
var msg = cut.FindComponent<MockInput<string>>().Instance.GetErrorMessage();
Assert.Equal(HasServiceAttribute.Success, msg);
}

[Fact]
public async Task TestService_Ok()
{
Expand Down Expand Up @@ -771,7 +771,7 @@ private class HasService
{
[HasService]
public string? Tag { get; set; }

[TestValidateRule]
public string? Tag2 { get; set; }
}
Expand Down