2

我有GridView (gvPart)aSqlDataSource (sdsParts)作为它的数据源。对gvPart了,我有财产AllowPaging="true"。我还有 aTextBox (txtPartSearch)和 aButton用于输入和执行搜索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,在footer中点击page 2会显示第二页,但是数据会来自原始数据的page 2(也就是之前拉取的数据)搜索,默认SelectCommandsdsParts)。

似乎分页“重置”SqlDataSource并使用了SelectCommand用 Default.aspx 编写的,不管任何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="".

为什么SelectCommandsdsParts重置”,我该如何解决/避免这种情况?

编辑

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

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

4

2 回答 2

1

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

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

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

于 2013-07-12T21:41:10.360 回答
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
}

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

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

于 2013-07-12T21:44:36.880 回答