Activities of "Spospisil"

Hi,

I am getting the below error when I am launching my Blazor WASM application. I believe it's happening because the app.MapAbpStaticAssets is trying to retrieve my appsettings.json file from the Virtural File System, but I always want it to be served from wwwroot. Part of what complicates this is we want our application to be serviced from a subfolder of "/Blazor", so we are using the app.UsePathBase method.

At runtime we dynamically populate the appsettings.json file with configurable values from our container environment which is why I need the above functionality. Based on another ticket (https://abp.io/support/questions/9666/Fontawesome-Icons-Not-Showing#answer-3a1b6d7e-4e0e-c8aa-30c8-249d1caa71f8) I believe this is why my font awesome icons are not showing so if I can resolve this issue I think it'll resolve my other issue.

I've created a github repo with a sample project created with ABP Studio and the code to reproduce the issue. If you can examine the code in the TestWasmBlazorModule and tell me if I have it correct in order to do what I detailed above that would be helpful.

I've shared access to this repo with maliming

Hi,

I have a layered blazor wasm solution and have implemented bundling in the new was as described in the following link https://abp.io/community/articles/abp-global-assets-new-way-to-bundle-javascriptcss-files-in-blazor-webassembly-app-i0nu10rs#gsc.tab=0

Since doing this none of my icons in the menu or on any buttons display. Below is the log from my blazor container and I can see the fontawesome and bootstrap icons css files are being bundled correctly. Is there something else I should be checking?

[12:43:44 INF] Bundling __bundles/BlazorWebAssembly.Global.AF4DD7383108129CF8360DD6A0E7C166.css (22 files) [12:43:45 INF] > Minified _content/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/libs/fontawesome/css/all.css (148801 bytes -> 105148 bytes) [12:43:45 INF] > Minified _content/Volo.Abp.AspNetCore.Components.Web/libs/abp/css/abp.css (1342 bytes -> 878 bytes) [12:43:45 INF] > Minified _content/Volo.Abp.BlazoriseUI/volo.abp.blazoriseui.css (1274 bytes -> 939 bytes) [12:43:45 INF] > Minified _content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/side-menu/libs/bootstrap-icons/font/bootstrap-icons.css (74827 bytes -> 57858 bytes) [12:43:45 INF] > Minified _content/DevExpress.Blazor.Dashboard/dx-analytics.common.css (102301 bytes -> 90434 bytes) [12:43:45 INF] > Minified _content/DevExpress.Blazor.Dashboard/dx-querybuilder.css (76926 bytes -> 69960 bytes) [12:43:45 INF] > Minified _content/DevExpress.Blazor.Dashboard/ace.css (28733 bytes -> 24467 bytes) [12:43:45 INF] > Minified _content/DevExpress.Blazor.Dashboard/ace-theme-dreamweaver.css (3207 bytes -> 2566 bytes) [12:43:45 INF] > Minified _content/DevExpress.Blazor.Dashboard/ace-theme-ambiance.css (3929 bytes -> 3265 bytes) [12:43:45 INF] > Minified _content/DevExpress.Blazor.Dashboard/dx.light.css (649674 bytes -> 647385 bytes) [12:43:45 INF] > Minified _content/DevExpress.Blazor.Dashboard/dx-analytics.light.css (8566 bytes -> 7116 bytes) [12:43:45 INF] > Minified main.css (1261 bytes -> 842 bytes) [12:43:45 INF] > Minified cfd-styles.css (3296 bytes -> 2348 bytes) [12:43:45 INF] Bundled __bundles/BlazorWebAssembly.Global.AF4DD7383108129CF8360DD6A0E7C166.css (4590069 bytes) [12:43:45 INF] Bundling __bundles/BlazorWebAssembly.Global.EEB4B2EC0740665348BF3607CED7FACD.js (10 files) [12:43:45 INF] > Minified _content/Volo.Abp.AspNetCore.Components.Web/libs/abp/js/abp.js (8553 bytes -> 3582 bytes) [12:43:45 INF] > Minified _content/Volo.Abp.AspNetCore.Components.Web/libs/abp/js/lang-utils.js (676 bytes -> 371 bytes) [12:43:45 INF] > Minified _content/Volo.Abp.AspNetCore.Components.Web/libs/abp/js/authentication-state-listener.js (453 bytes -> 234 bytes) [12:43:45 INF] > Minified _content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/scripts/global.js (798 bytes -> 269 bytes) [12:43:45 INF] > Minified _content/Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme/scripts/leptonx-blazor-compatibility.js (5107 bytes -> 2285 bytes) [12:43:45 INF] Bundled __bundles/BlazorWebAssembly.Global.EEB4B2EC0740665348BF3607CED7FACD.js (579899 bytes)

Hi,

Is there an easy way for me to create functionality similar to ICurrentTenant that would allow me to implement an ICurrentCompany interface that functions just like ICurrentTenant such as the ability to change it at will (from a blazor WASM project). I have a layered blazor WASM solution and I have the requirement to store(in a cookie) the 'current company' (an guid id representing a record in the DB which is a 3 character value) that is set when a user of our application chooses a 'company' from the dropdown in the UI for our application.

Thanks

Question

I'm getting the following error for my solution and I do a clean and build.

There was no runtime pack for Microsoft.AspNetCore.App available for the specified RuntimeIdentifier 'browser-wasm'.

I've created a private repo on github and invited 'maliming' as a collaborator to it.

Hi,

I am trying to return from my application service an IQueryable<DataDictionary> so that I can use DevExpress's Blazor WASM grid for large datasets (https://demos.devexpress.com/blazor/Grid/DataBinding/LargeQueryable)and I am getting the error below in my application service.

Any idea what the underlying problem is and how I can fix it? I've given access to the private repository with a sample project to @maliming

Steps to Reproduce.

  1. Run migrator project create SQL database/Tables
  2. Run the DataDictionaryInsers.sql statements in SSMS against the DB just created
  3. Launch the solution and log in as host admin (typical credentials)
  4. Go to the /DataMigration page

crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Unhandled exception rendering component: The collection type 'System.Linq.IQueryable1[AbpSolution1.DataDictionaryDto]' is abstract, an interface, or is read only, and could not be instantiated and populated. Path: $ | LineNumber: 0 | BytePositionInLine: 1. System.NotSupportedException: The collection type 'System.Linq.IQueryable1[AbpSolution1.DataDictionaryDto]' is abstract, an interface, or is read only, and could not be instantiated and populated. Path: $ | LineNumber: 0 | BytePositionInLine: 1. ---> System.NotSupportedException: The collection type 'System.Linq.IQueryable1[AbpSolution1.DataDictionaryDto]' is abstract, an interface, or is read only, and could not be instantiated and populated. --- End of inner exception stack trace --- at System.Text.Json.ThrowHelper.ThrowNotSupportedException(ReadStack& state, Utf8JsonReader& reader, Exception innerException) at System.Text.Json.ThrowHelper.ThrowNotSupportedException_CannotPopulateCollection(Type type, Utf8JsonReader& reader, ReadStack& state) at System.Text.Json.Serialization.Converters.IEnumerableOfTConverter2[[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a],[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].CreateCollection(Utf8JsonReader& reader, ReadStack& state, JsonSerializerOptions options) at System.Text.Json.Serialization.JsonCollectionConverter2[[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a],[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, IQueryable1& value) at System.Text.Json.Serialization.JsonConverter1[[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, IQueryable1& value, Boolean& isPopulatedValue) at System.Text.Json.Serialization.JsonConverter1[[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].ReadCore(Utf8JsonReader& reader, IQueryable1& value, JsonSerializerOptions options, ReadStack& state) at System.Text.Json.Serialization.Metadata.JsonTypeInfo1[[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].Deserialize(Utf8JsonReader& reader, ReadStack& state) at System.Text.Json.JsonSerializer.ReadFromSpan[IQueryable1](ReadOnlySpan1 utf8Json, JsonTypeInfo1 jsonTypeInfo, Nullable1 actualByteCount) at System.Text.Json.JsonSerializer.ReadFromSpan[IQueryable1](ReadOnlySpan1 json, JsonTypeInfo1 jsonTypeInfo) at System.Text.Json.JsonSerializer.Deserialize[IQueryable1](String json, JsonSerializerOptions options) at Volo.Abp.Json.SystemTextJson.AbpSystemTextJsonSerializer.Deserialize[IQueryable1](String jsonString, Boolean camelCase) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.<RequestAsync>d__351[[AbpSolution1.IDataDictionaryAppService, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at Volo.Abp.Http.Client.DynamicProxying.DynamicHttpProxyInterceptorClientProxy1.<CallRequestAsync>d__01[[AbpSolution1.IDataDictionaryAppService, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at Volo.Abp.Http.Client.DynamicProxying.DynamicHttpProxyInterceptor1.<CallRequestAsync>d__261[[AbpSolution1.IDataDictionaryAppService, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at Volo.Abp.Http.Client.DynamicProxying.DynamicHttpProxyInterceptor1.<GetResultAsync>d__27[[AbpSolution1.IDataDictionaryAppService, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext() at Volo.Abp.Http.Client.DynamicProxying.DynamicHttpProxyInterceptor1.<InterceptAsync>d__24[[AbpSolution1.IDataDictionaryAppService, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext() at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.<InterceptAsync>d__31[[Volo.Abp.Http.Client.DynamicProxying.DynamicHttpProxyInterceptor1[[AbpSolution1.IDataDictionaryAppService, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Volo.Abp.Http.Client, Version=9.1.1.0, Culture=neutral, PublicKeyToken=null],[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at Castle.DynamicProxy.AsyncInterceptorBase.<ProceedAsynchronous>d__141[[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue1.<ProceedAsync>d__7[[System.Linq.IQueryable1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at Volo.Abp.Validation.ValidationInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.<InterceptAsync>d__31[[Volo.Abp.Validation.ValidationInterceptor, Volo.Abp.Validation, Version=9.1.1.0, Culture=neutral, PublicKeyToken=null],[System.Linq.IQueryable`1[[AbpSolution1.DataDictionaryDto, AbpSolution1.Application.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at CFData.Structure.Lexicon.Blazor.DataDictionaryManagement.GetEntitiesAsync() in D:\ABPSample4\AbpSolution1\src\AbpSolution1.Blazor.Client\Pages\DataDictionaryManagement.razor.cs:line 40 at CFData.Structure.Lexicon.Blazor.DataDictionaryManagement.OnInitializedAsync() in D:\ABPSample4\AbpSolution1\src\AbpSolution1.Blazor.Client\Pages\DataDictionaryManagement.razor.cs:line 31 at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync() at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)

I get the following message in my blazor webassembly app when I go to any abp page that has a blazorise component.

I am using ABP 9.1.0 and Blazorise 1.7.5

crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] Unhandled exception rendering component: Method not found: string Blazorise.IClassProvider.TableRowHoverCursor() System.MissingMethodException: Method not found: string Blazorise.IClassProvider.TableRowHoverCursor() at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[<HandleVirtualize>d__47](<HandleVirtualize>d__47& stateMachine) at Blazorise.DataGrid.DataGrid1[[Volo.Saas.Host.Dtos.SaasTenantDto, Volo.Saas.Host.Application.Contracts, Version=9.1.0.0, Culture=neutral, PublicKeyToken=null]].HandleVirtualize() at Blazorise.DataGrid.DataGrid1.<OnAfterRenderAsync>d__42[[Volo.Saas.Host.Dtos.SaasTenantDto, Volo.Saas.Host.Application.Contracts, Version=9.1.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext()

Hi,

I have implemented a custom ConnectionStringResolver class but the ICurrentTenant implementation does not resolve to the current logged in tenant. However I can't even get ABP's solutions to run even if I exclude this resolver class. At this point I have grown very tired of getting any sample projects to work to show support when I generate them using ABP tools, so I'll just give you the generated solution and you can figure out how to get it to run first and then we can have a discussion about the CurrentTenant issue I am having.

Can't waste yet another day trying to get a stock generated ABP solution to run

Steps to Reproduce:

  1. Get stock ABP generated solution to compile/run (Good luck as I've spend 2 days attempting to get it generated and to even work)
  2. Login in as host admin and create a Tenant of 'KENCO' with a non-shared DB (tenant has their own db)
  3. Login in as the KENCO tenant admin
  4. Monitor the debug messages I've added to the CFDMultiTenantConnectionStringResolver.cs class
  5. Observe the CurrentTenant variable still being set to null
  6. I've not been able to verify this test project will reproduce the issue I am experiencing as I've stated above I can't even get the ABP tool generated solution to compile/run

https://github.com/spospisil/ABPSampleTenant.git

Question

ABP studio works one week and then not another week. Here's the log.

19:12:59.879 Information Loaded ABP modules: 19:12:59.879 Information - Volo.Abp.Studio.UI.AbpStudioUIHostModule 19:12:59.879 Information - Volo.Abp.Studio.UI.AbpStudioUIViewsModule 19:12:59.879 Information - Volo.Abp.Studio.UI.AbpStudioUIViewModelsModule 19:12:59.879 Information - Volo.Abp.Studio.UI.AbpStudioUICoreModule 19:12:59.879 Information - Volo.Abp.Studio.AbpStudioDomainModule 19:12:59.879 Information - Volo.Abp.TextTemplating.Scriban.AbpTextTemplatingScribanModule 19:12:59.879 Information - Volo.Abp.TextTemplating.AbpTextTemplatingCoreModule 19:12:59.879 Information - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule 19:12:59.879 Information - Volo.Abp.Localization.AbpLocalizationAbstractionsModule 19:12:59.879 Information - Volo.Abp.Threading.AbpThreadingModule 19:12:59.880 Information - Volo.Abp.Autofac.AbpAutofacModule 19:12:59.880 Information - Volo.Abp.Castle.AbpCastleCoreModule 19:12:59.880 Information - Volo.Abp.BackgroundJobs.AbpBackgroundJobsAbstractionsModule 19:12:59.880 Information - Volo.Abp.Json.AbpJsonModule 19:12:59.880 Information - Volo.Abp.Json.SystemTextJson.AbpJsonSystemTextJsonModule 19:12:59.880 Information - Volo.Abp.Json.AbpJsonAbstractionsModule 19:12:59.880 Information - Volo.Abp.Timing.AbpTimingModule 19:12:59.880 Information - Volo.Abp.Localization.AbpLocalizationModule 19:12:59.880 Information - Volo.Abp.Settings.AbpSettingsModule 19:12:59.880 Information - Volo.Abp.Security.AbpSecurityModule 19:12:59.880 Information - Volo.Abp.Data.AbpDataModule 19:12:59.880 Information - Volo.Abp.ObjectExtending.AbpObjectExtendingModule 19:12:59.880 Information - Volo.Abp.Validation.AbpValidationAbstractionsModule 19:12:59.880 Information - Volo.Abp.Uow.AbpUnitOfWorkModule 19:12:59.880 Information - Volo.Abp.EventBus.Abstractions.AbpEventBusAbstractionsModule 19:12:59.880 Information - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule 19:12:59.880 Information - Volo.Abp.Studio.AbpStudioDomainSharedModule 19:12:59.880 Information - Volo.Abp.Cli.AbpCliCoreModule 19:12:59.880 Information - Volo.Abp.Domain.AbpDddDomainModule 19:12:59.880 Information - Volo.Abp.Auditing.AbpAuditingModule 19:12:59.880 Information - Volo.Abp.MultiTenancy.AbpMultiTenancyModule 19:12:59.880 Information - Volo.Abp.Auditing.AbpAuditingContractsModule 19:12:59.880 Information - Volo.Abp.EventBus.AbpEventBusModule 19:12:59.880 Information - Volo.Abp.Guids.AbpGuidsModule 19:12:59.880 Information - Volo.Abp.BackgroundWorkers.AbpBackgroundWorkersModule 19:12:59.880 Information - Volo.Abp.DistributedLocking.AbpDistributedLockingAbstractionsModule 19:12:59.880 Information - Volo.Abp.ObjectMapping.AbpObjectMappingModule 19:12:59.880 Information - Volo.Abp.ExceptionHandling.AbpExceptionHandlingModule 19:12:59.880 Information - Volo.Abp.Specifications.AbpSpecificationsModule 19:12:59.880 Information - Volo.Abp.Caching.AbpCachingModule 19:12:59.880 Information - Volo.Abp.Serialization.AbpSerializationModule 19:12:59.880 Information - Volo.Abp.Domain.AbpDddDomainSharedModule 19:12:59.880 Information - Volo.Abp.IdentityModel.AbpIdentityModelModule 19:12:59.880 Information - Volo.Abp.Minify.AbpMinifyModule 19:12:59.880 Information - Volo.Abp.Http.AbpHttpModule 19:12:59.880 Information - Volo.Abp.Http.AbpHttpAbstractionsModule 19:12:59.880 Information - Volo.Abp.Validation.AbpValidationModule 19:12:59.880 Information - Volo.Abp.Studio.AbpStudioCommonModule 19:12:59.880 Information - Volo.Abp.Application.AbpDddApplicationContractsModule 19:12:59.880 Information - Volo.Abp.AutoMapper.AbpAutoMapperModule 19:12:59.880 Information - Volo.Abp.BackgroundWorkers.Quartz.AbpBackgroundWorkersQuartzModule 19:12:59.880 Information - Volo.Abp.Quartz.AbpQuartzModule 19:12:59.880 Information - Volo.Abp.Studio.UI.Theming.AbpStudioUIThemingModule 19:12:59.891 Information Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl 19:12:59.891 Information Quartz Scheduler created 19:12:59.891 Information JobFactory set to: Quartz.Simpl.MicrosoftDependencyInjectionJobFactory 19:12:59.892 Information RAMJobStore initialized. 19:12:59.892 Information Quartz Scheduler 3.13.0.0 - '8b1810fb-6cb4-4bd1-a420-20b1f86120fb' with instanceId 'NON_CLUSTERED' initialized 19:12:59.892 Information Using thread pool 'Quartz.Simpl.DefaultThreadPool', size: 10 19:12:59.892 Information Using job store 'Quartz.Simpl.RAMJobStore', supports persistence: False, clustered: False 19:12:59.893 Information Adding 0 jobs, 0 triggers. 19:12:59.897 Information Scheduler 8b1810fb-6cb4-4bd1-a420-20b1f86120fb_$_NON_CLUSTERED started. 19:13:00.041 Information Starting ABP Studio Backend... 19:13:00.077 Information Initialized all ABP modules. 19:13:00.120 Information Application started. Press Ctrl+C to shut down. 19:13:00.120 Information Hosting environment: "Production" 19:13:00.120 Information Content root path: "C:\Users\steve\AppData\Local\abp-studio\current" 19:13:02.489 Warning Extension 'Volo.Abp.Studio.Extensions.StandardSolutionTemplates.Core.dll' is not loaded! Path: C:\Users\steve\AppData\Local\abp-studio\current\Volo.Abp.Studio.Extensions.StandardSolutionTemplates.Core.dll. 19:13:02.489 Warning Extension 'Volo.Abp.Studio.Extensions.StandardSolutionTemplates.UI.dll' is not loaded! Path: C:\Users\steve\AppData\Local\abp-studio\current\Volo.Abp.Studio.Extensions.StandardSolutionTemplates.UI.dll. 19:13:03.410 Information Start processing HTTP request "GET" "https://abp.io/api/app/post?" 19:13:03.410 Information Sending HTTP request "GET" "https://abp.io/api/app/post?" 19:13:04.051 Information Received HTTP response headers after 639.0676ms - 200 19:13:04.051 Information End processing HTTP request after 642.8875ms - 200 19:13:05.080 Information Trying to connect to ABP Studio Backend: "http://localhost:38271" 19:13:06.029 Information Received HTTP response headers after 538.0125ms - 200 19:13:06.029 Information End processing HTTP request after 538.4677ms - 200 19:13:06.093 Information Starting task execution: "Checking pre-requirements" 19:13:08.576 Information CLI command executed. Command: "abp cli version" Working directory: "C:\Users\steve\AppData\Local\abp-studio\current" CommandResult { ExitCode: 0, IsSuccess: True, StartTime: 05/20/2025 19:13:06 -04:00, ExitTime: 05/20/2025 19:13:08 -04:00, RunTime: 00:00:01.7451162 } 19:13:29.146 Warning Extension 'Volo.Abp.Studio.Extensions.StandardSolutionTemplates.Core.dll' is not loaded! Path: C:\Users\steve\AppData\Local\abp-studio\current\Volo.Abp.Studio.Extensions.StandardSolutionTemplates.Core.dll. 19:13:29.146 Warning Extension 'Volo.Abp.Studio.Extensions.StandardSolutionTemplates.UI.dll' is not loaded! Path: C:\Users\steve\AppData\Local\abp-studio\current\Volo.Abp.Studio.Extensions.StandardSolutionTemplates.UI.dll. 19:13:30.129 Warning .NET tool Volo.Abp.Studio.Cli installation failed. Exit code: 1, Output: volo.abp.studio.cli is not found in NuGet feeds C:\Program Files\DevExpress 24.1\Components\Offline Packages\devexpress.aspnetcore.reporting\24.1.5\lib\net6.0, C:\Program Files\DevExpress 22.1\Components\System\Components\Packages, C:\Program Files\DevExpress 23.1\Components\System\Components\Packages, C:\Program Files\DevExpress 23.2\Components\System\Components\Packages, C:\Program Files\DevExpress 24.1\Components\System\Components\Packages, C:\Program Files (x86)\Microsoft SDKs\NuGetPackages. , StandardOutput: 19:13:33.130 Information Completed task execution: "Checking pre-requirements" 19:13:33.133 Information Starting task execution: "Loading extensions" 19:13:33.138 Warning "Volo.Abp.Studio.Extensions.StandardSolutionTemplates" extension not found in the NuGet cache. Directory: "C:\Users\steve.nuget\packages\volo.abp.studio.extensions.standardsolutiontemplates\0.9.26\lib\net9.0" 19:13:33.138 Information "Volo.Abp.Studio.Extensions.StandardSolutionTemplates" (v: "0.9.26") extension trying install from the NuGet 19:13:34.004 Information Exception of type 'Volo.Abp.Studio.AbpStudioException' was thrown. 19:13:34.004 Information Code:AbpStudio:NugetPackageNotFound 19:13:34.004 Information Details: 19:13:34.004 Information ---------- Exception Data ---------- PackageId = Volo.Abp.Studio.Extensions.StandardSolutionTemplates Version = 0.9.26

19:13:34.006 Warning Extension 'Volo.Abp.Studio.Extensions.StandardSolutionTemplates.Core.dll' is not loaded! Path: C:\Users\steve\AppData\Local\abp-studio\current\Volo.Abp.Studio.Extensions.StandardSolutionTemplates.Core.dll. 19:13:34.006 Warning Extension 'Volo.Abp.Studio.Extensions.StandardSolutionTemplates.UI.dll' is not loaded! Path: C:\Users\steve\AppData\Local\abp-studio\current\Volo.Abp.Studio.Extensions.StandardSolutionTemplates.UI.dll. 19:13:34.007 Information Completed task execution: "Loading extensions" 19:13:34.008 Information Starting task execution: "Checking for the new version of ABP Studio" 19:13:34.015 Information [VPK] Checking for updates... URL: https://abp.io/api/abp-studio/r/download/windows 19:13:34.618 Information Downloading release file 'releases.beta.json' from 'https://abp.io/api/abp-studio/r/download/windows/releases.beta.json?arch=x64&os=win&rid=win-x64&id=abp-studio&localVersion=0.9.26'. 19:13:34.619 Information [VPK] Creating HttpClient for AbpIoFileDownloader 19:13:34.619 Information Start processing HTTP request "GET" "https://abp.io/api/abp-studio/r/download/windows/releases.beta.json?" 19:13:34.619 Information Sending HTTP request "GET" "https://abp.io/api/abp-studio/r/download/windows/releases.beta.json?" 19:13:35.254 Information Received HTTP response headers after 634.8312ms - 200 19:13:35.254 Information End processing HTTP request after 635.075ms - 200 19:13:35.259 Information No updates, remote version (0.9.26) is not newer than current version (0.9.26) and / or downgrade is not enabled. 19:13:35.259 Information [VPK] No updates available. 19:13:35.260 Information Completed task execution: "Checking for the new version of ABP Studio" 19:14:13.309 Information Starting task execution: "Checking for the new version of ABP Studio" 19:14:13.338 Information [VPK] Checking for updates... URL: https://abp.io/api/abp-studio/r/download/windows 19:14:13.924 Information Downloading release file 'releases.beta.json' from 'https://abp.io/api/abp-studio/r/download/windows/releases.beta.json?arch=x64&os=win&rid=win-x64&id=abp-studio&localVersion=0.9.26'. 19:14:13.924 Information [VPK] Creating HttpClient for AbpIoFileDownloader 19:14:13.924 Information Start processing HTTP request "GET" "https://abp.io/api/abp-studio/r/download/windows/releases.beta.json?" 19:14:13.924 Information Sending HTTP request "GET" "https://abp.io/api/abp-studio/r/download/windows/releases.beta.json?" 19:14:14.297 Information Received HTTP response headers after 372.9096ms - 200 19:14:14.297 Information End processing HTTP request after 373.0463ms - 200 19:14:14.297 Information No updates, remote version (0.9.26) is not newer than current version (0.9.26) and / or downgrade is not enabled. 19:14:14.298 Information [VPK] No updates available. 19:14:14.298 Information Completed task execution: "Checking for the new version of ABP Studio"19:14:41.084 Information Start processing HTTP request "GET" "http://localhost:3000/CrudPageGenerator/Create" 19:14:41.084 Information Sending HTTP request "GET" "http://localhost:3000/CrudPageGenerator/Create" 19:14:45.553 Information Start processing HTTP request "GET" "http://localhost:3000/CrudPageGenerator/Create" 19:14:45.554 Information Sending HTTP request "GET" "http://localhost:3000/CrudPageGenerator/Create" 19:14:51.561 Information Start processing HTTP request "GET" "http://localhost:3000/CrudPageGenerator/Create" 19:14:51.561 Information Sending HTTP request "GET" "http://localhost:3000/CrudPageGenerator/Create" 19:14:57.572 Information Start processing HTTP request "GET" "http://localhost:3000/CrudPageGenerator/Create" 19:14:57.572 Information Sending HTTP request "GET" "http://localhost:3000/CrudPageGenerator/Create" 19:14:58.469 Information Received HTTP response headers after 896.7469ms - 200 19:14:58.469 Information End processing HTTP request after 897.0322ms - 200

I'm trying to override the login page in my tired solution following this example (https://abp.io/docs/latest/framework/ui/mvc-razor-pages/customization-user-interface) and I am getting the following error in the browser.

Login.cshtml `@page @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Theming @using Microsoft.Extensions.Options @using Owl.reCAPTCHA @using Volo.Abp.Account.Localization @using Volo.Abp.Account.Public.Web.Pages.Account; @using Volo.Abp.Account.Public.Web.Security.Recaptcha @using Volo.Abp.Account.Settings @using Volo.Abp.Identity; @using Volo.Abp.Settings

@model CFData.Strucutre.Account.CustomLoginModel @inject IThemeManager ThemeManager @inject IHtmlLocalizer L @inject Volo.Abp.AspNetCore.Mvc.UI.Layout.IPageLayout PageLayout @inject ISettingProvider SettingProvider

@{ PageLayout.Content.Title = L["Login"].Value; Layout = ThemeManager.CurrentTheme.GetAccountLayout(); var reCaptchaVersion = await SettingProvider.GetAsync(AccountSettingNames.Captcha.Version); if (Model.UseCaptcha) { await Model.ReCaptchaOptions.SetAsync(reCaptchaVersion == 3 ? reCAPTCHAConsts.V3 : reCAPTCHAConsts.V2); }

}

@section scripts {



``` @if (Model.UseCaptcha) { if (reCaptchaVersion == 3) { <recaptcha-script-v3 /> <recaptcha-script-v3-js action="login" execute="false" /> } else { <recaptcha-script-v2 /> } } ```

}

@if (Model.IsLinkLogin) {

@L["LinkAccountWarning", Url.PageLink()]

}

@if (Model.BackToExternalLogins) {

<a class="mb-3 btn btn-primary btn-block" href="@Url.Page("./ExternalLogins")">@L["Back"]

}

@if (Model.IsSelfRegistrationEnabled)
{
    &lt;h5 class=&quot;mb-2&quot;&gt;@L["NotAMemberYet"] &lt;a class=&quot;text-decoration-none&quot; href=&quot;@Url.Page(&quot;./Register&quot;, new {returnUrl = Model.ReturnUrl, returnUrlHash = Model.ReturnUrlHash})&quot;&gt;@L["Register"]&lt;/a&gt;&lt;/h5&gt;
}

@if (Model.EnableLocalLogin)
{
    &lt;form method=&quot;post&quot; id=&quot;loginForm&quot;&gt;
        @if (Model.UseCaptcha)
        {
            &lt;input class=&quot;mb-3&quot; data-captcha=&quot;true&quot; type=&quot;hidden&quot; name=&quot;@RecaptchaValidatorBase.RecaptchaResponseKey&quot; id=&quot;@RecaptchaValidatorBase.RecaptchaResponseKey&quot;/&gt;
        }
        &lt;div&gt;
            &lt;div class=&quot;form-floating mb-2&quot;&gt;
                &lt;input asp-for=&quot;LoginInput.UserNameOrEmailAddress&quot; type=&quot;text&quot; class=&quot;form-control&quot; placeholder=&quot;name@example.com&quot;&gt;
                @Html.LabelFor(m => m.LoginInput.UserNameOrEmailAddress)
                &lt;span asp-validation-for=&quot;LoginInput.UserNameOrEmailAddress&quot;/&gt;
            &lt;/div&gt;

            &lt;div class=&quot;form-floating mb-2&quot;&gt;
                &lt;input asp-for=&quot;LoginInput.Password&quot; id=&quot;password-input&quot; type=&quot;password&quot; class=&quot;form-control&quot; placeholder=&quot;Password&quot;&gt;
                @Html.LabelFor(m => m.LoginInput.Password)
                &lt;i id=&quot;PasswordVisibilityButton&quot; class=&quot;bi bi-eye-slash show-pass-icon&quot; data-bs-toggle=&quot;tooltip&quot; data-bs-placement=&quot;top&quot; data-bs-html=&quot;true&quot; aria-label=&quot;@L[&quot;ShowPassword&quot;]&quot; data-bs-original-title=&quot;@L[&quot;ShowPassword&quot;]&quot;&gt;&lt;/i&gt;
                &lt;i id=&quot;capslockicon&quot; class=&quot;bi bi-capslock caps-lock-icon&quot; style=&quot;display: none;&quot; data-bs-toggle=&quot;tooltip&quot; data-bs-placement=&quot;top&quot; data-bs-html=&quot;true&quot; aria-label=&quot;&lt;i class=&#39;bi bi-exclamation-circle&#39;&gt;&lt;/i&gt; @L["CapsLockOn"]!" data-bs-original-title="&lt;i class=&#39;bi bi-exclamation-circle&#39;&gt;&lt;/i&gt; @L["CapsLockOn"]!">&lt;/i&gt;
                &lt;span asp-validation-for=&quot;LoginInput.Password&quot;/&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;abp-row&gt;
            &lt;abp-column&gt;
                &lt;div class=&quot;form-switch ps-2&quot;&gt;
                    &lt;abp-input asp-for=&quot;LoginInput.RememberMe&quot; class=&quot;mb-4&quot;/&gt;
                &lt;/div&gt;
            &lt;/abp-column&gt;
            &lt;abp-column class=&quot;text-end&quot;&gt;
                &lt;a href=&quot;@Url.Page(&quot;./ForgotPassword&quot;, new {returnUrl = Model.ReturnUrl, returnUrlHash = Model.ReturnUrlHash})&quot;&gt;@L["ForgotPassword"]&lt;/a&gt;
            &lt;/abp-column&gt;
        &lt;/abp-row&gt;

        @if (reCaptchaVersion == 2)
        {
            &lt;script&gt;
                recaptchaCallback = function (token) {
                    $('form button[type=submit]').removeAttr("disabled");
                    $('#@RecaptchaValidatorBase.RecaptchaResponseKey').val(token)
                };
            &lt;/script&gt;
            &lt;div class=&quot;mb-3&quot;&gt;
                &lt;recaptcha-div-v2 callback=&quot;recaptchaCallback&quot;/&gt;
            &lt;/div&gt;
        }

        &lt;div class=&quot;d-grid gap-2&quot;&gt;
            &lt;abp-button button-type=&quot;Primary&quot; type=&quot;submit&quot; class=&quot;mb-3&quot; name=&quot;Action&quot; value=&quot;Login&quot; disabled=&quot;true&quot;&gt;
                &lt;i class=&quot;bi bi-box-arrow-in-right me-1&quot;&gt;&lt;/i&gt;
                @L["Login"]
            &lt;/abp-button&gt;
        &lt;/div&gt;

        @if (Model.ShowCancelButton)
        {
            &lt;div class=&quot;d-grid gap-2&quot;&gt;
                &lt;abp-button button-type=&quot;Secondary&quot; type=&quot;submit&quot; formnovalidate=&quot;formnovalidate&quot; class=&quot;mb-3&quot; name=&quot;Action&quot; value=&quot;Cancel&quot;&gt;@L["Cancel"]&lt;/abp-button&gt;
            &lt;/div&gt;
        }
    &lt;/form&gt;
}

@if (Model.VisibleExternalProviders.Any())
{
    if(Model.EnableLocalLogin)
    {
        &lt;hr/&gt;
        @L["OrSignInWith"]
        &lt;br/&gt;
    }
    else
    {
        @L["SignInWithOneOfTheFollowingProviders"]
    }

    &lt;form asp-page=&quot;./Login&quot; asp-page-handler=&quot;ExternalLogin&quot;
          asp-route-returnUrl=&quot;@Model.ReturnUrl&quot;
          asp-route-returnUrlHash=&quot;@Model.ReturnUrlHash&quot;
          asp-route-linkTenantId=&quot;@Model.LinkTenantId&quot;
          asp-route-linkUserId=&quot;@Model.LinkUserId&quot;
          asp-route-linkToken=&quot;@Model.LinkToken&quot;
          method=&quot;post&quot;&gt;
        @foreach (var provider in Model.VisibleExternalProviders)
        {
            &lt;button type=&quot;submit&quot;
                    class=&quot;mt-2 me-2 btn btn-outline-primary btn-sm&quot;
                    name=&quot;provider&quot;
                    value=&quot;@provider.AuthenticationScheme&quot;
                    data-busy-text=&quot;@L[&quot;ProcessingWithThreeDot&quot;]&quot;&gt;
                @if (provider.Icon != null)
                {
                    &lt;i class=&quot;@provider.Icon&quot;&gt;&lt;/i&gt;
                }
                &lt;span&gt;@provider.DisplayName&lt;/span&gt;
            &lt;/button&gt;
        }
    &lt;/form&gt;
}

` Login.cs `using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Options; using Owl.reCAPTCHA; using Volo.Abp.Account.Security.Recaptcha; using Volo.Abp.Account.ExternalProviders; using Volo.Abp.Security.Claims; using Volo.Abp.Account.Public.Web.Pages.Account; using Volo.Abp.Account.Public.Web;

namespace CFData.Strucutre.Account;

public class CustomLoginModel : LoginModel {

public CustomLoginModel(
    IAuthenticationSchemeProvider schemeProvider,
    IOptions&lt;AbpAccountOptions&gt; accountOptions,
    IAbpRecaptchaValidatorFactory recaptchaValidatorFactory,
    IAccountExternalProviderAppService accountExternalProviderAppService,
    ICurrentPrincipalAccessor currentPrincipalAccessor,
    IOptions&lt;IdentityOptions&gt; identityOptions,
    IOptionsSnapshot&lt;reCAPTCHAOptions&gt; reCaptchaOptions) : base (
        schemeProvider,
        accountOptions, 
        recaptchaValidatorFactory, 
        accountExternalProviderAppService,
        currentPrincipalAccessor,
        identityOptions, 
        reCaptchaOptions)
{
}

}

Login.js `$(function () {

var isRecaptchaEnabled = typeof grecaptcha !== 'undefined';
if (isRecaptchaEnabled) {
    grecaptcha.ready(function () {
        $("#loginForm button[type=submit]").removeAttr("disabled");
    });
} else {
    $("#loginForm button[type=submit]").removeAttr("disabled");
}

$("#loginForm button[type=submit]").click(function (e) {
    e.preventDefault();
    var form = $("#loginForm");
    if (form.valid() && isRecaptchaEnabled && abp.utils.isFunction(grecaptcha.reExecute)) {
        grecaptcha.reExecute(function (token) {
            form.find("input[type=hidden][data-captcha=true]").val(token);
            form.submit();
        })
    } else {
        form.submit();
    }
});

$("#PasswordVisibilityButton").click(function (e) {
    let button = $(this);
    let passwordInput = $('#password-input');
    if (!passwordInput) {
        return;
    }

    if (passwordInput.attr("type") === "password") {
        passwordInput.attr("type", "text");
    }
    else {
        passwordInput.attr("type", "password");
    }

    let icon = $("#PasswordVisibilityButton");
    if (icon) {
        icon.toggleClass("bi-eye-slash").toggleClass("bi-eye");
    }
});

// CAPS LOCK CONTROL
const password = document.getElementById('password-input');
const passwordMsg = document.getElementById('capslockicon');
if (password && passwordMsg) {
    password.addEventListener('keyup', e => {
        if (typeof e.getModifierState === 'function') {
            passwordMsg.style = e.getModifierState('CapsLock') ? 'display: inline' : 'display: none';
        }
    });
}

});

  • ABP Framework version: v7.3.0
  • UI Type: Blazor WASM
  • Database System: EF Core (PostgreSQL)
  • Tiered (for MVC) or Auth Server Separated (for Angular): yes

I had previously created a ticket on loading a pages layout dynamically which is now working for me, however when set the layout to the default 'SideMenuLayout' the user menu in the upper right does not seem to be able to be clicked on. I have experimented with overriding the OnAferRenderAsync of the SideMenuLayout class and when invoke 'initleptonX' and 'AfterLeptonXInitialization' functions every time that seems to fix the click issue, but then it causes the stylesheets to load multiple times.

I have 3 different layouts that I switch between (see DynamicLayoutPicker.razor.cs), so I have the same OnAfterRenderAsync method on my other two layouts defined the same way I have the SideMenuLayout.cs

Any idea how I can resolve this?

DynamicLayoutPicker.razor

@inherits LayoutComponentBase

<LayoutView Layout="@CurrentLayout">
    @Body
</LayoutView>

DynamicLayoutPicker.razor.cs

using CFDataSystems.StructureCloud.Blazor.Themes.LeptonX.Layouts.TenantLayout;
using CFDataSystems.StructureCloud.Components.Layouts;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Routing;
using System.Threading.Tasks;
using System;
using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout;

namespace CFDataSystems.StructureCloud.Blazor.Themes.LeptonX.Layouts;

public partial class DynamicLayoutPicker : LayoutComponentBase, IDisposable
{
    [Inject] private NavigationManager _navManager { get; set; }
    public Type CurrentLayout { get; set; } = typeof(SideMenuLayout);

    protected override Task OnInitializedAsync()
    {
        _navManager.LocationChanged += OnLocationChanged;
        SetLayout(_navManager.Uri);
        return base.OnInitializedAsync();
    }

    public void Dispose()
    {
        _navManager.LocationChanged -= OnLocationChanged;
    }

    private void OnLocationChanged(object sender, LocationChangedEventArgs e)
    {
        SetLayout(e.Location);
    }

    private void SetLayout(string location)
    {
        if (location.Contains("tenant-procedure-list"))
        {
            CurrentLayout = typeof(ProceduresPageLayout);
       }
        else if (location.Contains("SampleTenantDefault"))
        {
            CurrentLayout = typeof(TenantDefaultLayout);
        }
        else
        {
            CurrentLayout = typeof(SideMenuLayout);
        }

        StateHasChanged();
    }
}

ToolbarContributor.cs

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using System;
using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme;
using Volo.Abp.AspNetCore.Components.Web.Theming.Toolbars;
using SideMenuUserMenu = Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme.Components.ApplicationLayout.SideMenu.MainHeader.MainHeaderToolbarUserMenu;
using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout;
using CFDataSystems.StructureCloud.Blazor.Themes.LeptonX.Layouts;

namespace CFDataSystems.StructureCloud.Blazor.Toolbars;


public class StructureToolbarContributor : IToolbarContributor
{
    public Task ConfigureToolbarAsync(IToolbarConfigurationContext context)
    {
        if (context.Toolbar.Name == StandardToolbars.Main)
        {
            var options = context.ServiceProvider.GetRequiredService<IOptions<LeptonXThemeBlazorOptions>>().Value;

            if (options.Layout == typeof(DynamicLayoutPicker))
            {
                context.Toolbar.Items.Add(new ToolbarItem(typeof(SideMenuUserMenu)));
            }

        }
        return Task.CompletedTask;
    }
}

Abp Module Setting Toolbar options

        Configure<AbpToolbarOptions>(options =>
        {
            //Add the standard toolbar contributors as we are using the leptonX theme
            options.Contributors.Add(new LeptonXThemeToolbarContributor());

            //Add our own toolbar contributor as we are using the DynamicLayoutPicker component to dynamically change the layout
            //based on specific changes and we need to explicitly add the TopMenuUserMenu component to the toolbar.items collection since
            //the base LeptonX theme toolbar contributor does not factor in out custom layout.
            var layoutOptions = context.Services.GetRequiredService<IOptions<LeptonXThemeBlazorOptions>>().Value;
            if (layoutOptions.Layout == typeof(DynamicLayoutPicker))
            {
                options.Contributors.Add(new StructureToolbarContributor());
            }   
            //This is going to be used to receiving the messages coming from cobol to fire off popup's etc coming from
            //the Acu2Web pages
            //options.Contributors.Add(new MessageToolBarContributor());
        });
        

    private void ConfigureTheme()
    {
        Configure<LeptonXThemeBlazorOptions>(options =>
        {
            //options.Layout = LeptonXBlazorLayouts.SideMenu;
            options.Layout = typeof(DynamicLayoutPicker);
        });

        //https://abp.io/docs/latest/ui-themes/lepton-x/blazor?UI=Blazor#customization
        Configure<LeptonXThemeOptions>(options =>
        {
            options.Styles.Add("structurecloud",
                    new LeptonXThemeStyle(
                    LocalizableString.Create<StructureCloudResource>("Theme:StructueCloud"),
            "bi bi-circle-fill"));

            options.Styles.Remove(LeptonXStyleNames.System);
            options.Styles.Remove(LeptonXStyleNames.Light);
            options.Styles.Remove(LeptonXStyleNames.Dark);
            options.Styles.Remove(LeptonXStyleNames.Dim);


            options.DefaultStyle = "structurecloud";

        });
    }

SideMenuLayoutOverride.cs (I seem to have to do this to prevent the css stylesheets from loading muliple times)

using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Options;
using Microsoft.JSInterop;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Components.Web;
using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout;
using Volo.Abp.DependencyInjection;
using Volo.Abp.LeptonX.Shared;

namespace CFDataSystems.StructureCloud.Blazor.Themes.LeptonX.Layouts.TenantLayout;

[ExposeServices(typeof(SideMenuLayout))]
[Dependency(ReplaceServices = true)]
public partial class SideMenuLayoutOverride : SideMenuLayout
{

    [Inject]
    IJSRuntime JSRuntime { get; set; }


    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        var bExists = await UtilsService.HasClassOnTagAsync("body", "lpx-theme-" + Options.Value.DefaultStyle);

        if (!bExists)
        {
            await UtilsService.AddClassToTagAsync("body", GetBodyClassName());
            await JSRuntime.InvokeVoidAsync("initLeptonX", new[] { "side-menu", Options.Value.DefaultStyle });
            await JSRuntime.InvokeVoidAsync("afterLeptonXInitialization", new[] { "side-menu", Options.Value.DefaultStyle });
        }
    }

    private string GetBodyClassName()
    {
        return "lpx-theme-" + Options.Value.DefaultStyle;
    }
}

Showing 1 to 10 of 87 entries
Learn More, Pay Less
33% OFF
All Trainings!
Get Your Deal
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.0.0-preview. Updated on September 12, 2025, 10:20