我有一个包含一些数据源的页面。我正在重新设计页面本身,并希望将页面的某些部分拆分为多个用户控件。
在我的代码中,我有一个带有以下参数的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”绑定到数据源。在我的修订版中,应将此数据源移动到用户控件。
处理这样的场景的最佳方法是什么?
此致 洛伦佐
答案 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