HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunityDoc feedbackLog In
GitHubNuGetDev CommunityDoc feedback


This topic applies to sites using Web Forms.

One of the more influential groups of controls included in Optimizely Content Management System (CMS) are the data source controls. One of the major benefits of using these controls is that they minimize the need of code-behind for day-to-day operations involving reading data and populating various lists, trees, and so on. The new controls supports all or a few of the select, insert, update, and delete operations.

Some benefits of using the controls are:

  • Minimized need of plumbing code in code-behind.

  • Built-in support for select, insert, update and delete.

  • A contract that fits many of the built-in .NET controls and third-party controls.

You can categorize the data source controls as `Hierarchical`, `Tabular`, or both depending on how they can deliver data.

  • Hierarchical data source controls expose data in a hierarchical fashion (parent – child), which you can use for tree views such as the `TreeView` and `Menu` controls in ASP.NET.

  • Most controls serve data in tabular fashion, which you can use to list controls such as the `Repeater`, `DataList`, `GridView`, and so on.


An important difference between hierarchical and tabular data sources are that hierarchical data sources are read-only whereas the tabular data sources can support inserting, updating, and deleting.

The following controls implement the `IHierarchicalDataSource` interface and can generate data for tree view controls or menus:

  • `PageDataSource`

  • `CategoryDataSource`

  • `FileSystemDataSource`

To create your own tabular data source controls, use the base class `GenericDataSource`.

## Use a CMS data source control

The data source classes are intended to be used in markup rather than coded against or inherited from, so you should have little need to add your own code-behind. If you do need additional functionality, you should inherit from the `GenericDataSource` control and create classes that suit your needs.

The data source controls work as any standard control in an _.aspx_ page.

## Element attribute versus query parameter

When you populate a data source you usually use a [QueryStringParameter](🔗) to read a selection of objects from the database.  You can define a value for a member of the object as an attribute in the asp element and as a parameter in the query string. In this case, the query string definition takes precedence over the asp attribute. Consider the following example:

Because `IncludeRootCategory` is defined twice (being set to **true** in the tag definition and **false** in the `QueryStringParameter`), the value set in the query string parameter will be used. If no query string parameter named `IncludeRootCategory` is specified, it is default value will be used, in this case **false**. For information about using parameters with Data Source Controls, see Microsoft’s article [Using Parameters with Data Source Controls](🔗).


You should not use certain words to use as parameter names for http requests. For example, **ID** causes a conflict if you try to use it as a parameter name for one of your http requests, because ID is used to identify aspx pages in CMS. If the page had an ID of 200, every call to the `CategoryDataSource` would try to fetch categories with a parent ID of 200. You can solve the issue by adding text to certain words, such as changing **ID** to `CategoryID`.

## Create your own data source controls

Designing your own data source controls is a matter of inheriting from the `GenericDataSource` class. The following lines of code show how the `TabDefinitionDataSource` is defined. There is very little code involved to get access to the basic functionality.

**GenericDataSource\<TObject, TCollection, TKey>** has the following type parameters:

(Script tags will be stripped)

**Business Objects** Before you can create your data source control type, you need to have a class, your business object, that handles the data that you want to present. In the sample above the class used for this is `TabDefinition`. This class is responsible for reading and saving data from the database.

If you do not need to implement a specialized behavior in your collection of business objects, you can use the generic [List](🔗) provided by the .NET Framework as described in the following short sample:

## Map between control properties and data source parameters

A common way to limit a result set of a data source control is to provide it parameters in the `SelectParameters` collection (see [Parameter](🔗)). This is supported by most of the CMS data source controls by allowing certain control properties to be overridden by a parameter value. You can specify the following properties using `Parameters` for a given CMS data source control. The parameter name must correspond to the property name.

### PageDataSource

  • `AccessLevel``EPiServer.Security.AccessLevel`

  • `PageLink``EPiServer.Core.PageReference`

  • `PageLinkProperty``String`

  • `IncludeRootPage``Bool`

### SearchDataSource

  • `AccessLevel``EPiServer.Security.AccessLevel`

  • `PageLink ``EPiServer.Core.PageReference`

  • `PageLinkProperty``String`

  • `IncludeRootPage``Bool`

  • `OnlyWholeWords``Bool`

  • `SearchQuery``String`

  • `SearchFiles``Bool`

  • `SearchLocations``String`

  • `MainCatalog``String`

  • `MainScope``String`

  • `MaxAllowHits``Integer`

### CategoryDataSource

  • `IncludeRootCategory``Bool`

### FileSystemDataSource

### LanguageDataSource

### PageDefinitionDataSource

  • `Dynamic``Bool`

  • `PageTypeID``Integer`

### PageDefinitionTypeDataSource

  • `ID``Integer`

### TabDefinitionDataSource

  • `ID``Integer`

### MembershipUserDataSource

  • `UserName``string`

### SoftLinkDataSource

  • `PageLink``EPiServer.Core.PageReference`

  • `ListReferencing``Bool`