65.9K
CodeProject 正在变化。 阅读更多。
Home

ObjectDataSource 的复杂参数支持

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (6投票s)

2009年2月3日

CPOL

2分钟阅读

viewsIcon

41256

downloadIcon

324

一个示例,展示如何为 ASP.NET 数据源创建一个自定义参数,允许传递任意复杂的对象。

简介 - 对象数据源与对象参数

内置的 ASP .NET 数据源模型支持多种参数类型,允许我们通过诸如 SqlDataSourceXmlDataSource ObjectDataSource 等数据源来为应用程序提供数据。然而,内置参数的功能相对有限,你无法构建复杂的对象结构,并且所有类型都必须解析为少量的简单类型,例如 stringinteger。ASP.NET 允许的最接近的方式是在执行 Update Delete 时自动构造某些类型,但对于 Select 没有这样的支持。

这段示例代码展示了如何通过自定义参数类型 ObjectParameter 将任意对象作为输入传递给 ObjectDataSourcesObjectParameter 创建指定类型的一个实例,然后评估一组参数对象,以便填充对象的属性。从视觉上看,这有点像

ObjectParameter-Code

在 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
© . All rights reserved.