diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Navigation/BasicThemeNavigationExtensions.cs b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Navigation/BasicThemeNavigationExtensions.cs
new file mode 100644
index 0000000000..020709f56c
--- /dev/null
+++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Navigation/BasicThemeNavigationExtensions.cs
@@ -0,0 +1,26 @@
+using System;
+using JetBrains.Annotations;
+using Volo.Abp.UI.Navigation;
+
+namespace Volo.Abp.AspNetCore.Components.Web.BasicTheme.Navigation;
+
+public static class BasicThemeNavigationExtensions
+{
+ public const string CustomDataComponentKey = "BasicTheme.CustomComponent";
+
+ public static ApplicationMenuItem UseComponent(this ApplicationMenuItem applicationMenuItem, Type componentType)
+ {
+ return applicationMenuItem.WithCustomData(CustomDataComponentKey, componentType);
+ }
+
+ [CanBeNull]
+ public static Type GetComponentTypeOrDefault(this ApplicationMenuItem applicationMenuItem)
+ {
+ if (applicationMenuItem.CustomData.TryGetValue(CustomDataComponentKey, out object componentType))
+ {
+ return componentType as Type;
+ }
+
+ return default;
+ }
+}
\ No newline at end of file
diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor
index 86d74c51f8..b3ecb41862 100644
--- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor
+++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Web.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor
@@ -1,13 +1,19 @@
-@using Volo.Abp.UI.Navigation
+@using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Navigation;
+@using Volo.Abp.UI.Navigation
@{
var elementId = MenuItem.ElementId ?? "MenuItem_" + MenuItem.Name.Replace(".", "_");
var cssClass = string.IsNullOrEmpty(MenuItem.CssClass) ? string.Empty : MenuItem.CssClass;
var disabled = MenuItem.IsDisabled ? "disabled" : string.Empty;
var url = MenuItem.Url == null ? "#" : MenuItem.Url.TrimStart('/', '~');
+ var customComponentType = MenuItem.GetComponentTypeOrDefault();
}
@if (MenuItem.IsLeaf)
{
- if (MenuItem.Url != null)
+ if (customComponentType != null)
+ {
+