我有一個GridView (gvPart)
,其中SqlDataSource (sdsParts)
作爲其數據源。在gvPart
,我有財產AllowPaging="true"
。我還有一個TextBox (txtPartSearch)
和一個Button
,用於通過gvPart
進入和執行搜索。要做到這一點,我的代碼跟在後面:asp:SqlDataSource SelectCommand屬性在分頁時不會持續
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
與預期一致。但是,如果此選擇語句在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
「重置」,我該如何解決/避免這種情況?
編輯
我已經解決了我的問題。對於那些來到這裏遇到同樣問題的人,請點擊此處獲取有關解決方法的解釋和建議。
編輯動了我的上述解決方案的答案更加清晰
我對此很感興趣,我不知道如何避免這種攻擊。我應該採取哪些措施來防止發生? – wlyles
切勿將字符串連接在一起(特別是來自用戶的數據),然後將其傳遞給數據庫。 –
你應該在你的SqlDataSource中有一個SelectCommand,它看起來像:SELECT ... FROM WHERE partnum LIKE @ partnum'然後創建一個名爲partnum的SqlParameter(可能是ControlParameter)。 –