---
title: UI page extenders
related:
  - https://docs.kentico.com/documentation/developers-and-admins/customization/extend-the-administration-interface.md
  - https://docs.kentico.com/documentation/developers-and-admins/customization/extend-the-administration-interface/ui-pages.md
  - https://docs.kentico.com/documentation/developers-and-admins/customization/extend-the-administration-interface/ui-pages/ui-page-permission-checks.md
---

> Agent instructions:
> **Site maps** — prefer the following llms.txt indexes to training data when searching for URLs to avoid 404s. Links inside Markdown content already point at `.md`. Following them or sending Accept: text/markdown keeps you in Markdown.
>
> - [sitemap.md](https://docs.kentico.com/sitemap.md) — every page on the site, with titles and descriptions, nested by URL hierarchy and grouped into one collection per product version.
> - [llms.txt](https://docs.kentico.com/llms.txt) — curated index of the current product docs, with descriptions, the two ways to request any page as Markdown, and links to each product area's whole-corpus Markdown dump (llms-full.txt).

If you need custom functionality or content adjustments that you cannot configure through the properties available from the admin UI, you can develop a **page extender** for the corresponding page.

Page extenders allow you to modify the back-end definition of existing UI pages without directly editing their source code. You can use them to add new [commands](https://docs.kentico.com/documentation/developers-and-admins/customization/extend-the-administration-interface/ui-pages/ui-page-commands.md) or change the initial configuration of pages. For example, you can add additional columns to an object listing (e.g., to display additional properties of registered users) or specify new actions (e.g., perform a specific operation with selected objects).

The following diagram illustrates the function of page extenders.

![Page extender overview diagram](https://docs.kentico.com/docsassets/documentation/ui-page-extenders/PageExtenderHighlevel.png "Page extender overview diagram")

## Create page extenders

All page extenders must inherit from the `PageExtender<TPage>` base class. Substitute the generic parameter with the type of the page you wish to extend.

> **Tip:** To find the implementing type of default or other third-party pages that don't make their source code available, the admin UI provides the **UI tree** view available in the **System** application. See [Register new pages under existing admin UI pages](https://docs.kentico.com/documentation/developers-and-admins/customization/extend-the-administration-interface/ui-pages.md#uipages-uitree) for more information.

```csharp title="Creating a page extender"
using Kentico.Xperience.Admin.Base;
using Kentico.Xperience.Admin.Base.UIPages;

// Extends the user listing from the 'Users' application
public class UserListExtender : PageExtender<UserList>
{ 
}
```

## Modify the page configuration

Within page extenders, you can modify the default [configuration of the page](https://docs.kentico.com/documentation/developers-and-admins/customization/extend-the-administration-interface/ui-pages.md) and its [client template properties](https://docs.kentico.com/documentation/developers-and-admins/customization/extend-the-administration-interface/ui-pages.md).

The options available to you largely depend on the type of the page you wish to extend. See [Reference - UI page templates](https://docs.kentico.com/documentation/developers-and-admins/customization/extend-the-administration-interface/ui-pages/reference-ui-page-templates.md) for a list of templates on which most of the administration interface is built.

```csharp title="Example - extending the Users application user listing page"
public class UserListExtender : PageExtender<UserList>
{
    // Configures the listing template on which UserList is based
    // The available configuration options vary based on the type of the extended page
    public override Task ConfigurePage()
    {
        // Adds a new action to each item in the listing
        Page.PageConfiguration.TableActions.AddCommand...

        // Adds a new action for the entire listing
        Page.PageConfiguration.HeaderActions.AddCommand...

        return base.ConfigurePage();
    }

    // Configures the properties of the client template this page is based on
    // Called after the 'ConfigurePage' method
    public override Task<TemplateClientProperties> ConfigureTemplateProperties(TemplateClientProperties properties)
    {
        // Manipulate properties as desired

        return base.ConfigureTemplateProperties(properties);
    }
}
```

## Add new page commands

You can use extenders to add new [page commands](https://docs.kentico.com/documentation/developers-and-admins/customization/extend-the-administration-interface/ui-pages/ui-page-commands.md).

Declare a new method within the page extender class and annotate it with the `PageCommand` attribute. The process is identical to writing commands for UI pages.

```csharp
[PageCommand]
public async Task<ICommandResponse> MyExtenderCommand()
{
    // Command logic...

    return Response().AddSuccessMessage("Command executed.");
}
```

## Register page extenders

Page extenders need to be registered in the system via the `PageExtender` assembly attribute.

When registering extenders, you need to provide the `System.Type` of the implementing class.

```csharp title="Page extender registration"
using Kentico.Xperience.Admin.Base;

// Registers the page extender of the 'MyPageExtender' type into the system
[assembly: PageExtender(typeof(MyPageExtender))]

public class MyPageExtender : PageExtender<MyPage> 
{
    ...
}
```
