---
title: Partial routing
slug: cms-13/docs/partial-routing
createdAt: 2026-07-30T20:22:07.220Z
---

Partial routing extends URL routing beyond pages to handle data outside Optimizely CMS or non-page content types. Register a partial router for a content type to route any remaining URL path after content routing resolves the page.

For example, `http://site/News/` resolves to a page of model type `NewsContainer`. A partial router registered for `NewsContainer` routes the remaining path `Sports/TheGame/` to the matching content.

## `IPartialRouter` interface

Partial routers implement `EPiServer.Core.Routing.IPartialRouter<TContent, TRoutedData>` from the `EPiServer.dll` assembly. The generic constraint requires `TContent : EPiServer.Core.IContent`.

The interface defines the following methods:

- `RoutePartial` – Called when content routing resolves a page of type `TContent` and a remaining URL path exists. The implementation routes the remaining path.
- `GetPartialVirtualPath` – Called when the framework constructs an outgoing URL for a content instance of type `TOutgoing`.

## Pass `RouteValues` to a controller

Pass custom data from a partial router to an MVC controller through route values or HTTP context items. `UrlResolverContext.RouteValues` in the `RoutePartial` method mirrors `HttpContext.RouteValues`, which is read-only in ASP.NET Core.

Add data to route values through `IHttpContextAccessor.HttpContext.Items` or `IHttpContextAccessor.HttpContext.Request.RouteValues`:

```csharp
public class NewsPartialRouter: IPartialRouter<NewsContainer, NewsContent> {
  private readonly IHttpContextAccessor _contextAccessor;

  public object RoutePartial(NewsContainer content, UrlResolverContext urlResolverContext) {
    _contextAccessor.HttpContext.Request.RouteValues.Add("paramName", paramValue);
    // or
    _contextAccessor.HttpContext.Items.Add("paramName", paramValue);
    // MVC controller will be:
    // public IActionResult Index(NewsContainer currentContent, object paramName)
  }
}
```
