asp:SqlDataSource SelectCommand属性在分页时不会保留

时间:2013-07-11 00:00:51

标签: c# asp.net gridview sqldatasource

我有一个GridView (gvPart),其中SqlDataSource (sdsParts)为其数据源。在gvPart,我有属性AllowPaging="true"。我还有一个TextBox (txtPartSearch)和一个Button,用于通过gvPart输入和检索搜索。为此,我在后面的代码中有以下内容:

protected void partSearch(object sender, EventArgs e)
{
    string query = txtPartSearch.Text;
    string selectCmd = "SELECT ... WHERE partnum LIKE '" + query + "%' ... "; // I have cut out most of the statement for clarity
    sdsParts.SelectCommand = selectCmd;
    gvPart.DataBind();
}

这样做的目的是允许用户输入部件号,并使gvPart仅显示与查询匹配的部分而不是整个列表。

上述方法之后gvPart的第一页符合预期。但是,如果此select语句在gvPart中生成多个页面,则单击页脚中的第2页将显示第二页,但数据将来自原始数据的第2页(即,数据最初是在搜索之前提取的,SelectCommand中的默认sdsParts

似乎分页“重置”SqlDataSource并使用Default.aspx中编写的SelectCommand,而不管任何sdsParts.SelectCommand = selectCmd语句。

我尝试完全退出SelectCommand,以便sdsParts看起来像这样:

<asp:SqlDataSource ID="sdsParts" runat="server" ConnectionString="..." />

然后在Page_Load中添加默认值:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string selectCmd = "SELECT ... ";
        sdsParts.SelectCommand = selectCmd;
        gvPart.DataBind();
    }
}

但随后点击gvPart中的其他页面会将其设为空白,就像SelectCommand=""一样。

为什么SelectCommand sdsParts“重置”,以及如何修复/避免这种情况?

编辑

我已经解决了我的问题。对于那些来到这里遇到同样问题的人,请点击此处获取解决方法的解释和建议。

编辑将上述解决方案移至答案更清晰

2 个答案:

答案 0 :(得分:1)

出于安全考虑,SQLDataSource不会维护任何新的SelectCommand。因此,SelectCommand属性将恢复为.aspx文件中编码的原始值。一种可能的解决方案是使用Session变量,如下所示:

protected void partSearch(object sender, EventArgs e)
{
    string query = txtPartSearch.Text;
    string selectCmd = "SELECT ... WHERE partnum LIKE '" + query + "%' ... ";
    sdsParts.SelectCommand = selectCmd;
    Session["select"] = selectCmd;
}

Page_Load

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["select"] != null)
        sdsParts.SelectCommand = selectCmd;
    else
        sdsParts.SelectCommand = "SELECT ... "; //some default command
}

Click here获取更多信息并查看我的解决方案的位置。

注意:我不推荐上面生成select语句的方法,因为它会引发SQL注入攻击。建议使用SqlDataSource Parameters

答案 1 :(得分:0)

为什么要在后面的代码中更改SqlDataSource的SelectCommand?把它放在控制中。

其次,您的代码受SQL注入攻击,请不要将用户提供的数据连接到您的TSQL中......永远。

举一个例子,以及快速的痛苦教训,去运行你的程序并输入以下部件号';DROP TABLE PARTS;',然后在你哭完之后,如果你的老板不解雇你,改变你的代码。