Introduction - Object Data Sources with Object Parameters
The built in ASP .NET data-source model comes with support for a variety of parameter types, allowing us to feed our applications, used via data sources such as
ObjectDataSource. The built in parameters however are fairly limited, in that you cannot build complex object structures, and must have all types resolve to a handful of simple types such as
integers. The closest ASP.NET allows us is that it automatically constructs some types when performing an
Delete, but there is no such support for
This example code shows how to build arbitrary objects as inputs to
ObjectDataSources, by means of a custom parameter type,
ObjectParameter creates an instance of a specified type and then evaluates a set of parameter objects in order to populate the properties of the object. Visually this appears somewhat like:
When translated to ASP.NET, this appears as:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
<asp:ControlParameter ControlID="TxtForename" name="Forename" />
<asp:ControlParameter ControlID="TxtSurname" name="Surname" />
<asp:ControlParameter ControlID="TxtAge" name="MinAge" />
In this example, we're constructing a simple search parameters type entity, which fetches its state from various elements on the page. An instance of
SearchParametersEntity is created (using the default constructor) and then each of the property parameters are evaluated and applied to the properties of the object.
How Does It Work?
The way the code works is as follows:
- ASP.NET evaluates the arguments group for the data source by calling
Evaluate on the
ParameterCollection. This returns a dictionary of name to value mappings for each evaluated parameter.
- When the
ParameterCollection is evaluating the
ObjectParameter, we look at the value of the
TypeName attribute and instantiate the appropriate type dynamically.
ObjectParameter has its own
ParameterCollection (the '
Properties' property) that is evaluated.
- We map each of the returned values from the Properties
ParameterCollection onto the properties of the activated type through reflection.
Points to Note
- Always implement a
ToString() on objects you create for parameters, as ASP.NET uses the
ToString() value for the caching key when you enable caching on data sources.
- You can nest these arbitrarily to build up insanely large and complex object trees if you so desire.
- You can use any number of these to allow calling of code that requires multiple complex parameter inputs as arguments.
- Please ensure that you add the '
tagprefix' element to your web.config to register the parameter if you try referencing the library from your own code.
- 3rd Februrary, 2009 - Initial submission to CodeProject
Steve Gray is a Senior Developer at a British insurance company, working on a popular aggregator. When he's not writing ASP .NET, it's because there's SQL or WCF to write instead.