2

私はデータソースとしてGridView (gvPart)aを持っています。に、プロパティがありSqlDataSource (sdsParts)ます。また、を入力して検索を実行するために使用される ともあります。これを行うには、コードビハインドに次のものがあります。gvPartAllowPaging="true"TextBox (txtPartSearch)ButtongvPart

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 ページ目が表示されますが、データは元のデータのページ 2 からのものになります (つまり、のデフォルトSelectCommandで検索しますsdsParts)。

ページングは​​、ステートメントに関係なく、Default.aspx に記述されている を「リセット」しSqlDataSourceて使用するようです。SelectCommandsdsParts.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ですか? また、これを修正/回避するにはどうすればよいですか?

編集

私は自分の問題を解決しました。同じ問題でここに来た人は、ここをクリックして、回避策の説明と提案を参照してください。

編集より明確にするために、上記のソリューションを回答に移動しました

4

2 に答える 2

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
}

もう少し詳しい情報と私のソリューションの場所を確認するには、ここをクリックしてください。

注:上記の select ステートメントを生成する方法は、SQL インジェクション攻撃を招くため、お勧めしません。を使用することをお勧めしますSqlDataSource Parameters

于 2013-07-12T21:44:36.880 に答える
1

コード ビハインドで SqlDataSource の SelectCommand を変更するのはなぜですか? コントロールに入れます。

第二に、コードは SQL インジェクション攻撃の対象となります。ユーザーが提供したデータを TSQL に連結しないでください... 絶対に。

例として、そして痛みの簡単な教訓として、プログラムを実行して、次の部品番号を入力して';DROP TABLE PARTS;'ください。泣き終わったら、上司があなたを解雇しない場合は、コードを変更してください。

于 2013-07-12T21:41:10.360 に答える