我想创建一个高级搜索查询,允许用户输入任意数量的选项。
我正在使用这个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();
}
}
}
答案 0 :(得分:1)
看起来你的问题是你没有得到任何结果,是吗?
关键是,您正在创建一个接收所有过滤器并在所有过滤器之间生成和的查询,这意味着您要按所有内容过滤数据即便如此,用户只选择了其中的一个或两个。
您正在寻找的是一个处理没有其中一个过滤器的可能性的查询,您可以通过使用多个&#34; ifs&#34;并连接各个部分。
我强烈建议您使用命令参数或某些ORM来避免sql注入(如果这是用于生产用途),连接查询文本将导致巨大的安全漏洞。