web层的控件之SearchControl

先来看看自己以前做的Search功能吧:

<h3>
搜索结果
</h3>
<asp:Repeater ID="repSearch" runat="server">
<ItemTemplate>
<p>
<a href='newscontent.aspx?newsid=<%#Eval("id") %>' target="_blank" title="<%#Eval("title") %>">
<img src="images/b11.jpg" class="daohang" style="border-color: White"/>&nbsp;<%# StringTruncat(Eval("title").ToString(),20,"") %></a>
<span id="time">
<%# Eval("creattime") %></p>
</ItemTemplate>
</asp:Repeater>

主要还是用一个Repeater控件来绑定搜索结果,那么我的搜索是是提供标题搜索和内容搜索两种。具体DAL处理应该是


///<summary>
/// 搜索新闻
public DataTable SelectByContent(string content,string title)
{
// TODO:根据内容搜索新闻
DataTable dt =new DataTable();
string cmdText ="news_search";
SqlParameter[] paras
=new SqlParameter[] {
new SqlParameter("@content", content),
new SqlParameter("@title",title)
};
dt
= sqlhelper.ExecuteQuery(cmdText, paras, CommandType.StoredProcedure);
return dt;
}

下面是SelectContent的存储过程:

ALTERPROCEDURE[dbo].[news_SelectByContent]
@contentvarchar(1000)
AS
BEGIN
selecttop5 n.id,c.[name],n.title,n.creatTime,n.caid
from news n,category c
where n.caid=c.id and n.[content]like'%'+@content+'%'
orderby creattime desc
END

那么petshop的搜索到底是怎样完成的呢?

<%@ OutputCache Duration="100000" VaryByParam="page;keywords" Shared="true"%>
<%@ Register TagPrefix="PetShopControl" Namespace="PetShop.Web"%>
<div align="center" class="searchPosition">
<div class="label">Search results for <b><%= Request.QueryString["keywords"] %></b>:</div>
<PetShopControl:CustomList ID="searchList" runat="server" EmptyText="No products found." OnPageIndexChanged="PageChanged" PageSize="4" RepeatColumns="2" CellPadding="16" CellSpacing="0" Width="500px">
<ItemTemplate>
<table cellpadding="0" cellspacing="0">
<tr>
<td valign="top" width="91"><a href='Items.aspx?productId=<%# Eval("Id") %>&categoryId=<%# Eval("categoryId") %>'><img id="imgProduct" alt='<%# Eval("Name") %>' src='<%# Eval("Image") %>' style="border- 0px;" runat="server" /></a></td>
<td width="26">&nbsp;</td>
<td valign="top" width="120"><a href='Items.aspx?productId=<%# Eval("Id") %>&categoryId=<%# Eval("categoryId") %>'><div class="productName"><%# Eval("Name") %></div></a><div class="productDescription"><%# Eval("Description") %></div></td>
</tr>
</table>
</ItemTemplate>
<ItemStyle HorizontalAlign="Left" VerticalAlign="Top"/>
</PetShopControl:CustomList>

</div>

但是上面的数据绑定控件PetShopControl:CustomList这个是什么控件呢?根据后台代码推测这是一个DataList控件。现在知道了,他是对DateList进行重写。

protectedvoid PageChanged(object sender, DataGridPageChangedEventArgs e) {
//这应该是用DateGrid自带的分页控件
searchList.CurrentPageIndex = e.NewPageIndex;

//从浏览器中得到搜索关键字
string keywordKey = Request.QueryString["keywords"];

//产品声明一个Product对象(BLL层的)
Product product =new Product();
searchList.DataSource
= product.GetProductsBySearch(keywordKey);
searchList.DataBind();
}

那么还是来看下BLL层他是怎么样调用这个产品搜索的呢?

public IList<ProductInfo> GetProductsBySearch(string text) {

// 判断字符串是否为空
if (string.IsNullOrEmpty(text.Trim()))
returnnew List<ProductInfo>();

// 因为她这个搜索提供多关键字的搜索,这样的搜索我是没做过
//我一般只做一个关键字的搜索的,这样的搜索会比较合理吧
string[] keywords = text.Split();

// 直接调用DAL层的搜索功能
//这个思路很清晰 跟我们一般做的一样
return dal.GetProductsBySearch(keywords);
}

接下来不用多说,就是看DAL层中的GetProductsBySearch这个功能到底是怎样实现的。

 1 public IList<ProductInfo> GetProductsBySearch(string[] keywords) {
2
3 IList<ProductInfo> productsBySearch =new List<ProductInfo>();
4
5 int numKeywords = keywords.Length;
6
7 //Create a new query string
8 StringBuilder sql =new StringBuilder(SQL_SELECT_PRODUCTS_BY_SEARCH1);
9
10 //Add each keyword to the query
11 for (int i =0; i < numKeywords; i++) {
12 sql.Append(string.Format(SQL_SELECT_PRODUCTS_BY_SEARCH2, PARM_KEYWORD + i));
13 sql.Append(i +1< numKeywords ? SQL_SELECT_PRODUCTS_BY_SEARCH3 : SQL_SELECT_PRODUCTS_BY_SEARCH4);
14 }
15
16 string sqlProductsBySearch = sql.ToString();
17 SqlParameter[] parms = SqlHelper.GetCachedParameters(sqlProductsBySearch);
18
19 // If the parameters are null build a new set
20 if (parms ==null) {
21 parms =new SqlParameter[numKeywords];
22
23 for (int i =0; i < numKeywords; i++)
24 parms[i] =new SqlParameter(PARM_KEYWORD + i, SqlDbType.VarChar, 80);
25
26 SqlHelper.CacheParameters(sqlProductsBySearch, parms);
27 }
28
29 // Bind the new parameters
30 for (int i =0; i < numKeywords; i++)
31 parms[i].Value = keywords[i];
32
33 //Finally execute the query
34 using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, sqlProductsBySearch, parms)) {
35 while (rdr.Read()) {
36 ProductInfo product =new ProductInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4));
37 productsBySearch.Add(product);
38 }
39 }
40
41 return productsBySearch;
42 }

因为这是多个关键字搜索,所以会比较麻烦一点,麻烦在哪里呢?就是怎样处理这些关键字。这段代码非常精彩,字符串分割恰到好处,应该是行11到行14。

我下面把她整理出来,这里就先假设字符串的长度为二。

SELECT ProductId, Name, Descn, Product.Image, Product.CategoryId 
FROM Product
WHERE ((LOWER(Name) LIKE'%'+@Keyword0+'%'ORLOWER(CategoryId) LIKE'%'+@Keyword0+'%')
OR (LOWER(Name) LIKE'%'+@Keyword1+'%'ORLOWER(CategoryId) LIKE'%'+@Keyword1+'%'));

他们做的跟我的差不多,就是多了个允许多字符串的查询,还用到了缓存。

原文地址:https://www.cnblogs.com/huaizuo/p/2108162.html