- @if (IsUploadButtonAtFirst)
+ @if (IsUploadButtonAtFirst && ShowAddButton())
{
@RenderAdd
}
@@ -101,7 +101,7 @@
}
- @if (!IsUploadButtonAtFirst)
+ @if (!IsUploadButtonAtFirst && ShowAddButton())
{
@RenderAdd
}
@@ -115,7 +115,7 @@
@code {
RenderFragment RenderAdd =>
- @
-
+ @
+
;
}
From 3246c8b1d71ad0b2355335d9bbbe3f8d473ecd8b Mon Sep 17 00:00:00 2001
From: Tony-ST0754 <6914529@qq.com>
Date: Sun, 16 Aug 2026 08:51:31 +0800
Subject: [PATCH 5/9] =?UTF-8?q?fix(CardUpload):=E4=BF=AE=E6=AD=A3CardUploa?=
=?UTF-8?q?d=E3=80=81AvatarUpload=E8=BF=99=E4=B8=A4=E4=B8=AA=E7=BB=84?=
=?UTF-8?q?=E4=BB=B6=E8=A1=A8=E5=8D=95=E9=AA=8C=E8=AF=81=E6=97=B6=E6=8F=90?=
=?UTF-8?q?=E7=A4=BA=E4=BF=A1=E6=81=AF=E4=B8=8D=E8=83=BD=E6=AD=A3=E7=A1=AE?=
=?UTF-8?q?=E7=A7=BB=E9=99=A4=E7=9A=84Bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
refactor: 变更逻辑
feat(validate): 增加bootstrap.Tooltip全局缓存,以解决CardUpload上传后,添加按钮未渲染的问题,导致ToolTip无法正确移除
---
.../Components/Upload/CardUpload.razor | 2 +-
src/BootstrapBlazor/wwwroot/modules/validate.js | 13 ++++++++++++-
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Upload/CardUpload.razor b/src/BootstrapBlazor/Components/Upload/CardUpload.razor
index d8d9cece1da..70e82515dde 100644
--- a/src/BootstrapBlazor/Components/Upload/CardUpload.razor
+++ b/src/BootstrapBlazor/Components/Upload/CardUpload.razor
@@ -116,6 +116,6 @@
@code {
RenderFragment RenderAdd =>
@
-
+
;
}
diff --git a/src/BootstrapBlazor/wwwroot/modules/validate.js b/src/BootstrapBlazor/wwwroot/modules/validate.js
index 776a5e1a7e0..40dc0d7afe1 100644
--- a/src/BootstrapBlazor/wwwroot/modules/validate.js
+++ b/src/BootstrapBlazor/wwwroot/modules/validate.js
@@ -1,8 +1,9 @@
-export function execute(id, title) {
+export function execute(id, title) {
const el = document.getElementById(id);
if (el) {
const tip = bootstrap.Tooltip.getOrCreateInstance(el, { customClass: 'is-invalid', title })
+ tooltipCache.set(id, tip); // 缓存实例
if (!tip._isShown()) {
if (title !== tip._config.title) {
tip._config.title = title;
@@ -27,6 +28,8 @@ const showResult = el => {
return ret;
}
+const tooltipCache = new Map(); // 全局缓存池,用来处理上传时增加按钮未渲染,导致提示不能正确删除
+
export function dispose(id) {
const el = document.getElementById(id)
@@ -34,6 +37,14 @@ export function dispose(id) {
const tip = bootstrap.Tooltip.getInstance(el)
if (tip) {
tip.dispose()
+ tooltipCache.delete(id); // 清理缓存
+ }
+ }
+ else {
+ const cachedTip = tooltipCache.get(id);
+ if (cachedTip) {
+ cachedTip.dispose();
+ tooltipCache.delete(id);
}
}
}
From 084780ef038fee6d881e01912729f2908705942d Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Tue, 18 Aug 2026 10:41:47 +0800
Subject: [PATCH 6/9] =?UTF-8?q?revert:=20=E6=92=A4=E9=94=80=E6=9B=B4?=
=?UTF-8?q?=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/BootstrapBlazor/wwwroot/modules/validate.js | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
diff --git a/src/BootstrapBlazor/wwwroot/modules/validate.js b/src/BootstrapBlazor/wwwroot/modules/validate.js
index 40dc0d7afe1..be6ecf9d5d7 100644
--- a/src/BootstrapBlazor/wwwroot/modules/validate.js
+++ b/src/BootstrapBlazor/wwwroot/modules/validate.js
@@ -2,8 +2,7 @@ export function execute(id, title) {
const el = document.getElementById(id);
if (el) {
- const tip = bootstrap.Tooltip.getOrCreateInstance(el, { customClass: 'is-invalid', title })
- tooltipCache.set(id, tip); // 缓存实例
+ const tip = bootstrap.Tooltip.getOrCreateInstance(el, { customClass: 'is-invalid', title });
if (!tip._isShown()) {
if (title !== tip._config.title) {
tip._config.title = title;
@@ -28,8 +27,6 @@ const showResult = el => {
return ret;
}
-const tooltipCache = new Map(); // 全局缓存池,用来处理上传时增加按钮未渲染,导致提示不能正确删除
-
export function dispose(id) {
const el = document.getElementById(id)
@@ -37,14 +34,6 @@ export function dispose(id) {
const tip = bootstrap.Tooltip.getInstance(el)
if (tip) {
tip.dispose()
- tooltipCache.delete(id); // 清理缓存
- }
- }
- else {
- const cachedTip = tooltipCache.get(id);
- if (cachedTip) {
- cachedTip.dispose();
- tooltipCache.delete(id);
}
}
}
From 174061c779b1ba4d95f4ca7b3ec8293e90bc844c Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Tue, 18 Aug 2026 21:28:02 +0800
Subject: [PATCH 7/9] feat: add disposeTip function
---
src/BootstrapBlazor/wwwroot/modules/validate.js | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/BootstrapBlazor/wwwroot/modules/validate.js b/src/BootstrapBlazor/wwwroot/modules/validate.js
index be6ecf9d5d7..2a0bce1932e 100644
--- a/src/BootstrapBlazor/wwwroot/modules/validate.js
+++ b/src/BootstrapBlazor/wwwroot/modules/validate.js
@@ -28,8 +28,11 @@ const showResult = el => {
}
export function dispose(id) {
- const el = document.getElementById(id)
+ const el = document.getElementById(id);
+ disposeTip(el);
+}
+const disposeTip = el => {
if (el) {
const tip = bootstrap.Tooltip.getInstance(el)
if (tip) {
From f462f009c663a967e2ab7c2436e177b08aa8bb9f Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 21 Aug 2026 09:41:45 +0800
Subject: [PATCH 8/9] =?UTF-8?q?refactor:=20=E5=A7=8B=E7=BB=88=E4=BC=A0?=
=?UTF-8?q?=E9=80=92=20AddId=20=E5=88=B0=E5=AE=A2=E6=88=B7=E7=AB=AF?=
=?UTF-8?q?=E4=BE=BF=E4=BA=8E=E7=BC=93=E5=AD=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs | 3 +--
src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs | 3 +--
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
index 2b98d153bc3..01b1716d17d 100644
--- a/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
+++ b/src/BootstrapBlazor/Components/Upload/AvatarUpload.razor.cs
@@ -199,8 +199,7 @@ public override async Task ToggleMessage(IReadOnlyCollection r
? [AddId]
: Files.Select(i => i.ValidateId).ToList();
var invalidItems = _results.GetInvalidItems(IsInValidOnAddItem, AddId);
- var addId = IsInValidOnAddItem ? null : AddId;
- await ValidateModule.InvokeVoidAsync("executeUpload", items, invalidItems, addId);
+ await ValidateModule.InvokeVoidAsync("executeUpload", items, invalidItems, AddId);
}
private bool IsInValidOnAddItem => Files.Count == 0 && _results.Count > 0;
diff --git a/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs b/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs
index e464c682e01..0ca20e7cae6 100644
--- a/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs
+++ b/src/BootstrapBlazor/Components/Upload/CardUpload.razor.cs
@@ -260,8 +260,7 @@ public override async Task ToggleMessage(IReadOnlyCollection r
? [AddId]
: Files.Select(i => i.ValidateId).ToList();
var invalidItems = _results.GetInvalidItems(IsInValidOnAddItem, AddId);
- var addId = IsInValidOnAddItem ? null : AddId;
- await ValidateModule.InvokeVoidAsync("executeUpload", items, invalidItems, addId);
+ await ValidateModule.InvokeVoidAsync("executeUpload", items, invalidItems, AddId);
}
private bool IsInValidOnAddItem => Files.Count == 0 && _results.Count > 0;
From 82ac8da49d8306961f0e201fad2b7ace3a85967f Mon Sep 17 00:00:00 2001
From: Argo Zhang
Date: Fri, 21 Aug 2026 09:42:08 +0800
Subject: [PATCH 9/9] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=20disposeTip?=
=?UTF-8?q?=20=E6=96=B9=E6=B3=95=E6=B6=88=E9=99=A4=20tooltip?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wwwroot/modules/validate.js | 33 +++++++++++++++----
1 file changed, 26 insertions(+), 7 deletions(-)
diff --git a/src/BootstrapBlazor/wwwroot/modules/validate.js b/src/BootstrapBlazor/wwwroot/modules/validate.js
index 2a0bce1932e..78ae72e6511 100644
--- a/src/BootstrapBlazor/wwwroot/modules/validate.js
+++ b/src/BootstrapBlazor/wwwroot/modules/validate.js
@@ -1,3 +1,5 @@
+import Data from "./data.js"
+
export function execute(id, title) {
const el = document.getElementById(id);
@@ -29,10 +31,6 @@ const showResult = el => {
export function dispose(id) {
const el = document.getElementById(id);
- disposeTip(el);
-}
-
-const disposeTip = el => {
if (el) {
const tip = bootstrap.Tooltip.getInstance(el)
if (tip) {
@@ -51,20 +49,41 @@ export function executeUpload(items, invalidItems, addId) {
execute(id, errorMessage);
el.classList.remove('is-valid');
el.classList.add('is-invalid');
+
+ if (id === addId) {
+ const tip = bootstrap.Tooltip.getInstance(el);
+ if (tip) {
+ Data.set(addId, tip);
+ addId = null;
+ }
+ }
}
else {
dispose(id);
el.classList.remove('is-invalid');
el.classList.add('is-valid');
+
+ disposeTip(addId);
+ addId = null;
}
}
});
if (addId) {
- const el = document.getElementById(addId);
+ disposeTip(addId);
+ }
+}
+
+const disposeTip = id => {
+ const tip = Data.get(id);
+ Data.remove(id);
+
+ if (tip) {
+ tip.dispose();
+
+ const el = document.getElementById(id);
if (el) {
- el.classList.remove('is-valid', 'is-invalid');
- dispose(addId);
+ el.classList.remove('is-invalid');
}
}
}