Found an issue when upgrading one our sites (Nimble). I asked AI to compare Nimble to another site: Zipline which is 10.3 and does not exhibit the issue
Found the answer. Nimble has Volo.Abp.Identity.Pro.Web — Zipline does not.
Nimble is an MVC/Razor project, so it includes the Identity Pro Web module which serves the Razor-based admin pages (ClaimTypes,
Roles, Users, etc.) using jQuery DataTables. Zipline is an Angular project — it only has Volo.Abp.Identity.Pro.HttpApi and renders
those same admin pages using Angular components (no jQuery DataTables at all).
The duplicate pager is a DataTables layout issue specific to the Razor admin pages. Zipline doesn't have it because it doesn't use
those pages — identity management in Zipline is all Angular UI.
That said, the double pager is still likely an OOTB issue in ABP 10.3's Razor Identity pages (DataTables 2.x layout change).

1 Answer(s)
-
0
- In ABP 10.3 MVC/Razor UI, the Identity Pro Web module (
Volo.Abp.Identity.Pro.Web) renders the admin lists (Users/Roles/ClaimTypes/OpenIddict, etc.) using jQuery DataTables. - The “double pager” you see is a DataTables DOM/layout rendering issue (typically caused by a mismatch between the DataTables version/markup expectations and the page’s
dom/wrapper HTML/CSS). That’s why your Angular project doesn’t show it: it doesn’t use the Razor/DataTables-based pages.
Workaround (recommended, no module source change): override the DataTables
domfor the affected pages- In your MVC web project, create a JS file that runs after ABP’s datatables initialization and forces a single set of pager/length controls by overriding
dom(or removing one of the duplicated containers). - Load it after the theme/global scripts.
A practical approach is to set a custom
dom(single length + filter + table + info + pager). Example:// wwwroot/js/fix-identity-datatables-pager.js (function () { // Hook into ABP's DataTable default options if (!($.fn && $.fn.dataTable)) { return; } // If ABP (or your page) initializes tables multiple times with different layouts, // forcing a consistent dom avoids duplicated pagers. $.extend(true, $.fn.dataTable.defaults, { // One top row (length + filter), one bottom row (info + pager) dom: "<'row'<'col-sm-6'l><'col-sm-6'f>>" + "<'row'<'col-sm-12'tr>>" + "<'row'<'col-sm-5'i><'col-sm-7'p>>" }); })();Then include it (e.g. in your main layout or a bundle) so it’s loaded after jQuery/DataTables/ABP scripts.
If you prefer a “surgical” fix per-page, you can also override the page’s DataTable options where the table is created and set
domthere (same idea).Why this happens in 10.3
- ABP MVC/Razor pages depend on DataTables and ABP’s wrappers. If DataTables (or its Bootstrap integration) changed its default layout behavior, you can end up with both the ABP-provided wrapper controls and DataTables-generated controls visible, giving a “double pager”.
Link (verified):
- https://abp.io/docs/latest/framework/ui/mvc-razor-pages/data-tables
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.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) - In ABP 10.3 MVC/Razor UI, the Identity Pro Web module (