ASP母版页:如何将子页面中的值传递给母版页上的SqlDataSource参数

时间:2013-05-30 18:08:39

标签: asp.net

这是一个难题。母版页上的数据源将其SelectParameter引用到包含(宏)子页面上的一些文本的标签控件:

<asp:SqlDataSource ... SelectCommand="SELECT * FROM [tblMyTable] WHERE (([strField] = ?) ">
            <SelectParameters>
                <asp:ControlParameter Name="strField" ControlID="cphMaster$cphChild$lblGrandchild" propertyname="Text" DbType="String"/>
            </SelectParameters>
        </asp:SqlDataSource>

但这会产生错误(“System.Data.OleDb.OleDbException:条件表达式中的数据类型不匹配。”)

我已经检查过明显的(strField确实是一个字符串,ContentPlaceHolder(cph)控件通过其ID正确识别)。有任何想法吗?

我的基本方法是'ControlParameter读取放置在ContentPlaceholder(s)中的控件'是一种将值传递给SelectParameter的合理方法吗?

4 个答案:

答案 0 :(得分:0)

我建议您在母版页类上创建一个类型为SQLDataSource的公共属性,可以访问您的子页面。

YourMasterPage.vb(母版的类名是YourMasterPage)

Private _mastersqldatasource as SqlDataSource
Public ReadOnly Property MasterSQLDataSource() As SqlDataSource
        Get
            Return SqlDataSource1
        End Get
End Property

然后您可以访问您的子页面

dim myMasterPage as YourMasterPage
myMasterPage = DirectCast(Me.Page.Master, YourMasterPage)
myMasterPage.MasterSQLDataSource.SelectParameters("strField").DefaultValue = lblGrandChild.Text

希望这会有所帮助,我过去常常以这种方式使用

答案 1 :(得分:0)

您可以在子页面.cs文件中使用以下代码。

SqlDataSource ds = this.MasterPage.FindControl("datasourceid");
// now you can custimize this ds according to your problem

答案 2 :(得分:0)

事实证明我的方法很好。在我的实际应用程序中,我有几个标准,问题是SelectParameters与WHERE子句中的条件的顺序不同。当订单相同时,该方法有效。

所以:

SELECT * FROM [myTable] WHERE [FieldA] = ? AND [FieldB] = ? AND [FieldC] = ?

需要:

   <SelectParameters>
      <asp:ControlParameter Name="FieldA" ControlID="cphMaster$cphChild$lblGrandChildA .../>
      <asp:ControlParameter Name="FieldB" ControlID="cphMaster$cphChild$lblGrandChildB .../>
      <asp:ControlParameter Name="FieldC" ControlID="cphMaster$cphChild$lblGrandChildC .../>
   </SelectParameters>

即,不是ACB等。我从未遇到过这种行为,这种行为可能来自主/子(/孙子)结构。希望这有助于其他人。

答案 3 :(得分:0)

祝贺您似乎能够解决问题。如果您允许用户使用某些浏览器(例如:IE,Firefox,Chrome,Safari)。 您可能需要检查 cphMaster$cphChild$lblGrandChildA 是否与控件的生成ID相同,在某些浏览器中,它将以呈现为 cphMaster_cphChild_lblGrandChildA 下划线,但如果您只允许您的用户只使用一个浏览器,则不会出现问题。