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=""
一样。
为什么sdsParts
的SelectCommand
"重置",以及如何修复/避免这种情况?
编辑
我已经解决了我的问题。对于那些带着同样问题来到这里的人,请单击此处获取解释和解决方法建议
EDIT将我的上述解决方案移动到一个答案以获得更清晰的
为什么要在代码后面更改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
。