• 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+'%'));

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

  • 相关阅读:
    程序员需要的各种PDF格式电子书【附网盘免费下载资源地址】
    Web安全大揭秘
    tar 压缩解压命令详解
    django开发项目的部署nginx
    CentOS7安装mysql-python模块
    我的博客站点上线了
    2006
    centos7安装pip
    mysql删除匿名用户
    FilenameFilter 文件名过滤
  • 原文地址:https://www.cnblogs.com/huaizuo/p/2108162.html
Copyright © 2020-2023  润新知