【问题标题】:Datasource with parameter in ASPX page to move in user control在 ASPX 页面中带有参数的数据源在用户控件中移动
【发布时间】:2010-09-02 12:49:19
【问题描述】:

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

在我的代码中,我有一个带有以下参数的 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”绑定到数据源。在我的版本中,这个数据源应该被移动到一个用户控件中。

处理这种情况的最佳方法是什么?

问候, 洛伦佐

【问题讨论】:

    标签: asp.net user-controls parameters objectdatasource


    【解决方案1】:

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

    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 属性,并期望将值转发给参数。

    【讨论】:

    • 对不起,我的问题不是很清楚。数据源应在用户控件内移动,但隐藏字段将继续留在 aspx 页面上。阅读您的解决方案似乎恰恰相反。
    • @Lorenzo - 很抱歉造成误解。我为相反的方法添加了一些策略。
    【解决方案2】:

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

    var cp = ObjectDataSource1.SelectParameters["albumID"] as ControlParameter;
    
    cp.ControlID = //Any one of a dozen ways to get this value into the control
    

    【讨论】:

    • 是的。这肯定是一个解决方案。但在使用代码以编程方式在用户控件上设置该值之前,我想探索是否有使用声明性代码解决问题的解决方案。还是谢谢!
    猜你喜欢
    • 2018-09-08
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多