---
title: Property Value List
slug: cms-11/dev-docs/property-value-list
docTags: 
createdAt: 2026-07-22T19:45:17.666Z
---

Property Value List lets editors input multiple primitive values.

The available and supported types are:

- `String`
- `Int`
- `DateTime`
- `Double`

The idea is the same as with the `List<T>` you add the list as a property to your model, and the default descriptors match `IList` type and render the correct editor.

```csharp
public virtual IList<string> ListOfStrings {
  get;
  set;
}
```

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/xE75_Y5O2nkpb_VV7WmPj-20260722-194634.png "stringlist.png")

```csharp
public virtual IList<int> ListOfIntegers { 
  get; 
  set; 
}
```

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/MLSgm4sYTvDuGwpeiq9f8-20260722-194634.png "intlist.png")

```csharp
public virtual IList<DateTime> ListOfDates { 
  get; 
  set; 
}
```

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/5n1sD_Ar1HMKPw1Sprnpb-20260722-194634.png "dateslist.png")

```csharp
public virtual IList<double> ListOfDoubles { 
  get; 
  set; 
}
```

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/5wPqN0nYFEVmnra-OLHyx-20260722-194634.png "doubleslist.png")

:::hint{type="info"}
**Note**
The property type does not have to be `IList`. The Optimizely descriptors are configured to match the `IList` interface but they also cover all base ones, so if you prefer to use `IEnumerable` or `ICollection` you can do so. All the following declarations are matched by the Value List descriptor.
:::

```csharp
public virtual IEnumerable<string> EnumerableStrings { 
  get; 
  set; 
}
public virtual ICollection<string> CollectionOfStrings { 
  get; 
  set; 
}
public virtual IList<string> ListOfStrings { 
  get; 
  set; 
}
```

## Validation

You can apply validation to the list and the individual items, and you can use `ListItemsAttribute` to control the number of items in the list:

```csharp
[ListItems(5)]
public virtual IList<int> Max5Items { 
  get; 
  set; 
}
```

You can apply the attributes to individual items:

```csharp
[ItemRangeAttribute(1, 10)]
public virtual IList<int> ItemsBetween1And10 { 
  get; 
  set;
}
    
[ItemRegularExpression("[a-zA-Z]*")]
public virtual IList<string> LettersOnly { 
  get; 
  set; 
}
    
[ItemStringLength(3)]
public virtual IList<string> ListOfAcronyms { 
  get; 
  set; 
}
```

## Render a list

To render a list:

```csharp
[Required]
[Display(Order = 305)]
[CultureSpecific]
public virtual IList<string> UniqueSellingPoints { 
  get; 
  set; }
```

To use the `PropertyFor` helper method, you must define a specific Display template, and to do that, you must first attach a `UIHint` to your property:

```csharp
[UIHint("StringsCollection")]
public virtual IList<string> UniqueSellingPoints { 
  get; 
  set; 
}
```

Then add a `StringsCollection.cshtml` file to the `~/Views/Shared/DisplayTemplates` folder.

You can see an example of a display template  in the Alloy package:

```csharp
@model IEnumerable<string>
@if(Model != null && Model.Any()) {
  <ul>
    @foreach(var stringValue in Model) {
    <li>@stringValue</li>
    }
  </ul>
}
```

Add a `UniqueSellingPoints` property to your page template:

```javascript
@Html.PropertyFor(x => x.CurrentPage.UniqueSellingPoints)
```

You will see the following result in on-page edit:

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/XucDpahcEgTgsbMtfNI4u-20260722-194634.png "uniquesellingpoints.png")
