<input type="file"> control: the “Choose file / No file chosen” text is rendered by the browser/OS, not by ABP (or ASP.NET Core), so it cannot be localized from your application’s localization resources.<input type="file"> to actually select/upload the file.A typical pattern (MVC/Razor Pages) is:
<input id="ProfilePictureInput" type="file" class="d-none" accept="image/*" />
<button type="button" class="btn btn-primary" onclick="document.getElementById('ProfilePictureInput').click();">
@L["ChooseFile"] <!-- your localization key -->
</button>
<span id="SelectedFileName">@L["NoFileChosen"]</span>
<script>
document.getElementById('ProfilePictureInput').addEventListener('change', function () {
const name = this.files && this.files.length ? this.files[0].name : '';
document.getElementById('SelectedFileName').textContent = name || '@L["NoFileChosen"]';
});
</script>
If you want ABP Commercial to provide this out-of-the-box in Account Pro, that’s a product/UX change request rather than something you can solve via ABP localization configuration (because the native text isn’t localizable). Please contact ABP/Volosoft to file the request: https://abp.io/contact
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
abp generate-proxy
- Ensure your Angular app is configured for proxy generation (per ABP Angular proxy docs).
Links worth checking (validated):
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Your analysis is correct for LeptonX 5.4.1: ContentToolbar subscribes to PageLayout change events in OnInitializedAsync using anonymous async lambdas and does not unsubscribe. Under Blazor Web App prerendering, those event continuations can run after the request DI scope is disposed, causing intermittent ObjectDisposedException. In interactive sessions, it also creates a subscription leak (component instances kept alive by the scoped PageLayout).
The safest/cleanest workaround today is exactly what you implemented: replace ContentToolbar with your own component that:
RendererInfo.IsInteractive == false), andIDisposable and unsubscribes using stored delegate fields (not anonymous lambdas).Recommended implementation (matches your workaround, shown here as a self-contained “drop-in” replacement pattern):
using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common;
using Volo.Abp.DependencyInjection;
[ExposeServices(typeof(ContentToolbar))]
[Dependency(ReplaceServices = true)]
public class SafeContentToolbar : ContentToolbar, IDisposable
{
private bool _disposed;
private NotifyCollectionChangedEventHandler? _collectionChanged;
private PropertyChangedEventHandler? _propertyChanged;
protected override Task OnInitializedAsync()
{
// IMPORTANT: do not call base.OnInitializedAsync() since it subscribes anonymous handlers.
if (!RendererInfo.IsInteractive)
{
// Prerender snapshot: no need to listen; avoids continuations after request-scope disposal.
return Task.CompletedTask;
}
_collectionChanged = async (_, _) =>
{
if (!_disposed)
{
await RenderAsync();
}
};
_propertyChanged = async (_, _) =>
{
if (!_disposed)
{
await InvokeAsync(StateHasChanged);
}
};
PageLayout.ToolbarItems.CollectionChanged += _collectionChanged;
PageLayout.PropertyChanged += _propertyChanged;
return Task.CompletedTask;
}
public void Dispose()
{
_disposed = true;
if (_collectionChanged is not null)
{
PageLayout.ToolbarItems.CollectionChanged -= _collectionChanged;
}
if (_propertyChanged is not null)
{
PageLayout.PropertyChanged -= _propertyChanged;
}
}
}
Apply the same pattern to any other LeptonX layout components that subscribe to PageLayout events (your stack trace also shows similar risk for components like Breadcrumbs).
If you want the “official” supported customization route: ABP documents replacing ContentToolbar via DI replacement (the exact approach you used with [ExposeServices] + [Dependency(ReplaceServices = true)]).
Sources (validated):
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Volo.Abp.BlazoriseUI 10.4.1 only enforces a minimum Blazorise version (>= 2.0.4) at the NuGet dependency level.Sources (validated):
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
CreatorId and CreationTime are intentionally not publicly settable on CreationAuditedEntity<TKey> / AuditedEntity<TKey> (their setters are protected set). This is to prevent accidentally changing “creation audit” values during updates; ABP sets them automatically when inserting an entity.Preferred: Don’t set them at all (let ABP set them)
CurrentUser is available, ABP will automatically set:
CreationTime (from IClock)CreatorId (from ICurrentUser.Id)Set them inside your entity class (because setters are protected)
public class MyEntity : AuditedEntity<Guid>
{
// ...
public void SetCreationAudit(Guid? creatorId, DateTime creationTime)
{
CreatorId = creatorId;
CreationTime = creationTime;
}
}
protected set is accessible from the derived type, but still prevents random code from changing it.ObjectHelper.TrySetProperty(...) (uses reflection internally) for such cases:ObjectHelper.TrySetProperty(entity, x => x.CreatorId, () => CurrentUser.Id);
ObjectHelper.TrySetProperty(entity, x => x.CreationTime, () => Clock.Now);
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Please contact us at https://abp.io/contact.
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
expected string/number, received null and unrecognized error field) match what happens when the MCP client receives non-conformant messages during the MCP handshake.dotnet tool update -g Volo.Abp.Studio.Cli
abp mcp-studio
If you cannot update immediately (workaround)
If after updating you still see issues, treat it as a Studio product issue and contact support with Studio logs (since this is ABP Studio/Commercial tooling behavior): https://abp.io/contact
Less obvious references:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Steps:
yarn upgrade @volo/abp.ng.identity.config
yarn.lock (or package-lock.json)yarn install
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.