繁体   English   中英

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

[英]asp:SqlDataSource SelectCommand property does not persist when paging

我有一个带有SqlDataSource (sdsParts)作为数据源的GridView (gvPart) gvPart ,我具有属性AllowPaging="true" 我也有一个TextBox (txtPartSearch)Button被用于输入和exectue通过搜索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导致一页gvPart ,则单击页脚中的第2页将显示第二页,但是数据将来自原始数据的第2页(即,最初在之前拉出的数据)搜索,并在sdsParts使用默认的SelectCommand )。

似乎分页“重置”了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另一个页面, gvPart使其空白,就像SelectCommand=""

为何sdsPartsSelectCommand sdsParts “重置”,我该如何解决/避免这种情况?

编辑

\n

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

编辑将我上面的解决方案移到答案以更清楚

为了安全起见, 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

为什么要在后面的代码中更改SqlDataSource的SelectCommand? 将其放在控件中。

第二,您的代码容易受到SQL注入攻击,请不要将用户提供的数据连接到TSQL中。

举个例子,以及一个痛苦的快速课程,运行您的程序,然后输入以下内容作为零件号';DROP TABLE PARTS;' ,然后在您哭完之后,并且如果老板没有解雇您,请更改您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM