我有一个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
“重置”,以及如何修复/避免这种情况?
编辑
我已经解决了我的问题。对于那些来到这里遇到同样问题的人,请点击此处获取解决方法的解释和建议。
编辑将上述解决方案移至答案更清晰
答案 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;'
,然后在你哭完之后,如果你的老板不解雇你,改变你的代码。