Workflow
Dynamic Lookup Items

Suppose that you want to change a field that renders as a textbox into a static drop down list of items, such as the Reorder Level field in the Products controller of the Northwind sample. By default, users can enter any numeric value in the field.

'Reorder Level' field showing numbers and as a textbox

Let’s change this by offering a drop down list of predefined items, and have the item values displayed as words.

You can do this at design time, as explained in Creating Static Lookup Items. However, there may be other situations when you don’t want to change the physical properties of the application. For example, the static items maybe displayed only to users in specific roles. For this purpose, you can use virtualization node sets.

First, you will need to enable shared business rules.

Next, switch to the web application generator, select the project name, and press Develop. This will open the project in Visual Studio.

Develop button in Code On Time web application generator

In the Solution Explorer, navigate to ~/App_Code/Rules/SharedBusinessRules.cs(vb). The code will need to enable virtualization if the controller name is “Products”. The virtualized Products controller will have a modified ReorderLevel field. The Items Style will be changed to “Drop Down List”, and it will have the following static items:

Value Text
0 Zero
5 Five
10 Ten
15 Fifteen
20 Twenty
25 Twenty-five
30 Thirty

Place the code into your SharedBusinessRules.cs(vb) file:

C#:

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using MyCompany.Data;

namespace MyCompany.Rules
{
    public partial class SharedBusinessRules : MyCompany.Data.BusinessRules
    {
        public override bool SupportsVirtualization(string controllerName)
        {
            if (controllerName == "Products")
                return true;
            return false;
        }

        protected override void VirtualizeController(string controllerName)
        {
            if (controllerName == "Products")
            {
                NodeSet().SelectField("ReorderLevel")
                    .SetItemsStyle("DropDownList")
                    .CreateItem(0, "Zero")
                    .CreateItem(5, "Five")
                    .CreateItem(10, "Ten")
                    .CreateItem(15, "Fifteen")
                    .CreateItem(20, "Twenty")
                    .CreateItem(25, "Twenty-five")
                    .CreateItem(30, "Thirty");
            }
        }
    }
}

Visual Basic:

Imports MyCompany.Data
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Linq

Namespace MyCompany.Rules

    Partial Public Class SharedBusinessRules
        Inherits MyCompany.Data.BusinessRules

        Public Overrides Function SupportsVirtualization(controllerName As String) As Boolean
            If (controllerName = "Products") Then
                Return True
            Else  
Return False End If End Function Protected Overrides Sub VirtualizeController(controllerName As String) If (controllerName = "Products") Then NodeSet().SelectField("ReorderLevel") _ .SetItemsStyle("DropDownList") _ .CreateItem(0, "Zero") _ .CreateItem(5, "Five") _ .CreateItem(10, "Ten") _ .CreateItem(15, "Fifteen") _ .CreateItem(20, "Twenty") _ .CreateItem(25, "Twenty-five") _ .CreateItem(30, "Thirty") End If End Sub End Class End Namespace

Save this file and run the web application. You will see that the Products controller now displays Reorder Level filter options as words, and the field is rendered as a drop down list.

Reorder Level field in Products now showing static items as words, and as a drop down list