动态查询或高级搜索过滤器

时间:2016-12-26 16:28:01

标签: c# asp.net

我想创建一个高级搜索查询,允许用户输入任意数量的选项。

我正在使用这个ASP.NET下拉列表,checkboxlist,我正在使用Datalist来显示这些数据。

问题是它需要输入或选择所有过滤器才能工作。

检查我的代码有什么问题,请更正。(提前谢谢) (请更新我的代码以便更好地发布您的答案 理解。)

这是我的发送代码

protected void searchfilter_Click(object sender, EventArgs e)
{
    Session["price1"] = Convert.ToString(dropdownrs.SelectedItem);
    Session["price2"] = Convert.ToString(dropdownrs2.SelectedItem);
    Session["osx"] = Convert.ToString(dropdownos.SelectedItem);

    List<ListItem> ckbl1 = new List<ListItem>();

    foreach (ListItem li in CheckBoxList_internet.Items)
    {
        if (li.Selected)
        {
            ckbl1.Add(li);
            //Label1.Text += li.Value;
        }
    }

    Session["chkbx1"] = ckbl1;
    Session["phonetype"] = Convert.ToString(dropdown_phone_type.SelectedItem);
    Session["cam"] = Convert.ToString(dropdowncamera.SelectedItem);
    Session["ram"] = Convert.ToString(dropdownram.SelectedItem);
    Session["sim"] = Convert.ToString(dropdownsim.SelectedItem);

    List<ListItem> selection = new List<ListItem>();

    foreach (ListItem li in CheckBoxList1.Items)
    {
        if (li.Selected)
        {
            selection.Add(li);
            //Label1.Text += li.Value;
        }
    }

    Session["chkbx"] = selection;
    Response.Redirect("Searchpage.aspx");
}

在aspx页面上

public partial class Searchpage : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection();

    int price1;
    int price2;

    string osx;
    string chkbox_internet;
    string phonetype;
    string cam;
    string ram;
    string sim;
    string chkbox_brand;
    string q;

    protected void Page_Load(object sender, EventArgs e)
    {
        con.ConnectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
        con.Open();

        try
        {
            price1 = Convert.ToInt32(Session["price1"]);
            price2 = Convert.ToInt32(Session["price2"]);

            osx = Convert.ToString(Session["osx"]);
            chkbox_brand = Convert.ToString(Session["chkbx1"]);
            phonetype = Convert.ToString(Session["phonetype"]);
            cam = Convert.ToString(Session["cam"]);
            ram = Convert.ToString(Session["phonetype"]);       
            sim = Convert.ToString(Session["sim"]);
            chkbox_brand = Convert.ToString(Session["chkbx"]);

            q = "select * from legacy where price >= " + price1 + " and price <= " + price2 + " and os = '" + osx + "' and connectivity = '" + chkbox_internet + "' and phonetype= '" + phonetype + "' and camera='" + cam + "' and ram='" + ram + "' and sim='" + sim + "' and brand='" + chkbox_brand + "'";
            SqlDataSource1.SelectCommand = q;

            SqlDataSource1.DataBind();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

看起来你的问题是你没有得到任何结果,是吗?

关键是,您正在创建一个接收所有过滤器并在所有过滤器之间生成的查询,这意味着您要按所有内容过滤数据即便如此,用户只选择了其中的一个或两个。

您正在寻找的是一个处理没有其中一个过滤器的可能性的查询,您可以通过使用多个&#34; ifs&#34;并连接各个部分。

我强烈建议您使用命令参数或某些ORM来避免sql注入(如果这是用于生产用途),连接查询文本将导致巨大的安全漏洞。