2013-07-11 36 views
2

我有一個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(即,之前最初拉出的數據搜索,默認SelectCommandsdsParts)。

似乎分頁「重置」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=""

爲什麼SelectCommandsdsParts「重置」,我該如何解決/避免這種情況?

編輯

我已經解決了我的問題。對於那些來到這裏遇到同樣問題的人,請點擊此處獲取有關解決方法的解釋和建議。

編輯動了我的上述解決方案的答案更加清晰

回答

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

0

你爲什麼要改變一個SqlDataSource的SelectCommand在後面的代碼?把它放在控制之中。

其次,您的代碼受SQL注入攻擊,請不要將用戶提供的數據連接到您的TSQL ... EVER。

舉一個例子,並在痛苦中快速課,去運行你的程序,並輸入以下部件號';DROP TABLE PARTS;',然後哭完後,如果你的老闆不解僱你,更改你的代碼。

+0

我對此很感興趣,我不知道如何避免這種攻擊。我應該採取哪些措施來防止發生? – wlyles

+0

切勿將字符串連接在一起(特別是來自用戶的數據),然後將其傳遞給數據庫。 –

+0

你應該在你的SqlDataSource中有一個SelectCommand,它看起來像:SELECT ... FROM WHERE partnum LIKE @ partnum'然後創建一個名爲partnum的SqlParameter(可能是ControlParameter)。 –