asp:SqlDataSource SelectCommand属性在分页时不持久

本文关键字:分页 不持久 属性 SqlDataSource SelectCommand asp | 更新日期: 2023-09-27 18:21:49

我有一个以SqlDataSource (sdsParts)为数据源的GridView (gvPart)。在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=""一样。

为什么sdsPartsSelectCommand"重置",以及如何修复/避免这种情况?

编辑

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

EDIT将我的上述解决方案移动到一个答案以获得更清晰的

asp:SqlDataSource SelectCommand属性在分页时不持久

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

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

举个例子,以及一堂关于痛苦的快速课程,运行你的程序,输入下面的零件号';DROP TABLE PARTS;',然后在你哭完了之后,如果你的老板没有解雇你,就修改你的代码。

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
}

单击此处获取更多信息并查看我的解决方案的位置。

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