ObjectDataSource 的复杂参数支持






4.64/5 (6投票s)
一个示例,展示如何为 ASP.NET 数据源创建一个自定义参数,允许传递任意复杂的对象。
简介 - 对象数据源与对象参数
内置的 ASP .NET 数据源模型支持多种参数类型,允许我们通过诸如 SqlDataSource
、XmlDataSource
和 ObjectDataSource
等数据源来为应用程序提供数据。然而,内置参数的功能相对有限,你无法构建复杂的对象结构,并且所有类型都必须解析为少量的简单类型,例如 string
和 integer
。ASP.NET 允许的最接近的方式是在执行 Update
或 Delete
时自动构造某些类型,但对于 Select
没有这样的支持。
这段示例代码展示了如何通过自定义参数类型 ObjectParameter
将任意对象作为输入传递给 ObjectDataSources
。ObjectParameter
创建指定类型的一个实例,然后评估一组参数对象,以便填充对象的属性。从视觉上看,这有点像

在 ASP.NET 中,这表现为
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="SearchEntities"
TypeName="CobaltSoftware.ExampleBusinessLayer.SomedataObject,
CobaltSoftware.ExampleBusinessLayer">
<SelectParameters>
<Cobalt:ObjectParameter Name="input"
TypeName="CobaltSoftware.ExampleBusinessLayer.SearchParametersEntity,
CobaltSoftware.ExampleBusinessLayer" >
<Properties>
<asp:ControlParameter ControlID="TxtForename" name="Forename" />
<asp:ControlParameter ControlID="TxtSurname" name="Surname" />
<asp:ControlParameter ControlID="TxtAge" name="MinAge" />
</Properties>
</Cobalt:ObjectParameter>
</SelectParameters>
在这个例子中,我们正在构建一个简单的搜索参数类型实体,它从页面上的各种元素获取其状态。创建 SearchParametersEntity
的一个实例(使用默认构造函数),然后评估每个属性参数并将其应用于对象的属性。
它是如何工作的?
代码的工作方式如下
- ASP.NET 通过调用
ParameterCollection
上的Evaluate
来评估数据源的参数组。这将返回一个名称到值的映射字典,用于每个评估的参数。 - 当
ParameterCollection
评估ObjectParameter
时,我们会查看TypeName
属性的值并动态实例化适当的类型。 ObjectParameter
拥有自己的ParameterCollection
('Properties
' 属性),该属性会被评估。- 我们通过反射将
Properties
ParameterCollection
返回的每个值映射到已激活类型的属性上。
注意事项
- 始终为参数创建的对象实现
ToString()
,因为 ASP.NET 在启用数据源缓存时将ToString()
值用作缓存键。 - 如果你愿意,你可以任意嵌套这些,以构建巨大而复杂的对象树。
- 你可以使用任意数量的这些,以允许调用需要多个复杂参数作为参数的代码。
- 如果你尝试从自己的代码中引用该库,请确保将 '
tagprefix
' 元素添加到你的 web.config 文件中以注册该参数。
修订历史
- 2009年2月3日 - 首次提交至 CodeProject