数据源与ASPX页面中的参数一起移动到用户控件中

时间:2010-09-02 12:49:20

标签: asp.net user-controls parameters objectdatasource

我有一个包含一些数据源的页面。我正在重新设计页面本身,并希望将页面的某些部分拆分为多个用户控件。

在我的代码中,我有一个带有以下参数的ObjectDataSource对象

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
   TypeName="DataSetTableAdapters.PhotosTableAdapter"
   SelectMethod="GetPhotosForAlbum">
   <SelectParameters>
       <asp:ControlParameter Name="albumID" ControlID="txtAlbumID" Type="Int32"/>
   </SelectParameters>
</asp:ObjectDataSource>

这段代码自动将隐藏字段“txtAlbumId”绑定到数据源。在我的修订版中,应将此数据源移动到用户控件。

处理这样的场景的最佳方法是什么?

此致 洛伦佐

2 个答案:

答案 0 :(得分:2)

您可以在用户控件上创建一个属性,以便在隐藏字段上公开属性,如下所示:

public int AlbumID
{
    get { return Convert.ToInt32(txtAlbumID.Value); }
    set { txtAlbumID.Value = value.ToString(); }
}

然后,您应该能够将对象数据源连接到用户控件:

<asp:ControlParameter Name="albumID" ControlID="myUserControl" PropertyName="AlbumID" Type="Int32"/>

修改

有几种方法可以反过来(即用户控件中的数据源)。一种方法是可行的,但我发现让一些设计师感到困惑,就是将参数集合从用户控件中公开为公共属性:

public ParameterCollection SelectParameters
{
    get { return ObjectDataSource1.SelectParameters; }
}

这样做可以让您从页面填充参数集合,如下所示:

<my:UserControl runat="server" ID="myUserControl">
    <SelectParameters>
        <%-- ... --%>
    </SelectParameters>
</my:UserControl>

如果您使用设计器,您的控件将始终显示错误,但它可以正常工作。 (注意,我已经将这种方法用于查询字符串和会话参数。看看它是否能在控制参数中存活会很有趣。)

我认为,最简单的方法是将ControlParameter替换为普通的Parameter,并通过属性公开默认值。

public int AlbumID
{
    get { return Convert.ToInt32(ObjectDataSource1.Parameters[0].DefaultValue); }
    set { ObjectDataSource1.Parameters[0].DefaultValue = value.ToString(); }
}

然后,您可以将数据绑定或直接分配给控件的AlbumID属性,并期望将值转发到参数。

答案 1 :(得分:0)

另一种选择是以编程方式进行。

var cp = ObjectDataSource1.SelectParameters["albumID"] as ControlParameter;

cp.ControlID = //Any one of a dozen ways to get this value into the control