[英]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=""
。
为何sdsParts
的SelectCommand
sdsParts
“重置”,我该如何解决/避免这种情况?
编辑
我已经解决了我的问题。
对于那些来这里遇到同样问题的人,请单击此处以获取解释和建议,以寻求解决方法。
编辑将我上面的解决方案移到答案以更清楚
为了安全起见, 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.