Write the updated Directory.Packages.props content to a temp file in the same directory and swap it in with File.Replace instead of truncating the original file in place. A mid-write failure (disk full, process killed) now leaves the original file completely untouched instead of empty or partially written.
Keep the original project file encoding when rewriting updated NuGet package versions. This avoids forcing the default encoding during XML writes and stores the XML output before truncating the file stream.
Improve CLI package update behavior when resolving the latest `Volo.Abp.Core` nightly version fails or returns empty: the `--include` pass is now skipped explicitly with a warning while normal project updates continue. Also switch file reading in `VoloNugetPackagesVersionUpdater` to use the shared `DefaultEncoding` instead of `Encoding.Default` for consistent encoding handling.
Extend `switch-to-nightly` with `--include` and `--exclude-packages` options to optionally update Central Package Management files (like `Directory.Packages.props`) alongside regular project/package updates. The updater now resolves the nightly ABP version once, updates `PackageVersion Include="Volo.*"` entries with exclusion and LeptonX/Studio safeguards, and logs/continues on MyGet or file-write failures. Also fixes `.npmrc` registry appending to insert a newline before the added registry entry.
- Add NavigationManager.ResolveBrandingUrl and ResolveBrandingCssUrl
- Move the url rules to Volo.Abp.Ui.Branding.BrandingUrlHelper, shared with the mvc themes
ASP.NET Core's ValidationAttributeAdapterProvider has no adapter for
EnumDataTypeAttribute, so its ErrorMessage is never passed through the
IStringLocalizer and the raw localization key is returned to the client,
unlike every other common validation attribute.
Add EnumDataTypeAttributeAdapter and return it from
AbpValidationAttributeAdapterProvider.
ChildUnitOfWork subscribed a lambda to the parent's Failed and Disposed
events in its constructor and never unsubscribed, so every nested unit of
work left two delegates on the parent for the parent's whole lifetime.
Each delegate also captured the child, keeping disposed child instances
alive.
Forward the Failed and Disposed events straight to the parent with event
accessors instead, so nothing accumulates on the parent.
Handlers attached to a child still receive the parent's events with the
same sender and arguments, but their relative order can change: a handler
subscribed through a child now runs at the position where it was
subscribed, rather than where the child was constructed.
- Post the changed permission names from the MVC modal instead of the whole tree
- Replace the per-name list scans with dictionary lookups on the read path