文章教程

18.6信息搜索模块

8/31/2020 9:56:04 PM 人评论 次浏览

本书开始正式进入编码阶段,实现信息搜索处理功能。站内搜索的原理很简单,即提供一个用户搜索表单,单击搜索按钮后,将系统数据库中符合用户搜索关键字的信息列表显示出来。

信息搜索表单页面文件SearchFile.aspx的功能是提供信息搜索表单供用户进行信息检索。文件SearchFile.aspx的主要实现代码如下。

  <asp:ScriptManager ID="sm" runat="server"></asp:ScriptManager>
  <table class="Table" border="0" cellpadding="2" bgcolor="Black" cellspacing="1">
    <tr bgcolor="white">
      <td colspan="2"><hr /><a name="message"></a></td>
    </tr>
    <tr bgcolor="white">
      <td>文件名称:</td>
      <td width="280%">
      <asp:TextBox ID="tbName" runat="server" SkinID="nn" Width="60%" MaxLength="100">
      </asp:TextBox>
      <asp:RequiredFieldValidator ID="rfNameBlank" runat="server" ControlToValidate="tbName" Display="none" ErrorMessage="名称不能为空!"></asp:RequiredFieldValidator>
      <asp:RequiredFieldValidator ID="rfNameValue" runat="server" ControlToValidate="tbName" Display="none" InitialValue="请输入文件名称" ErrorMessage="名称不能为空!">
     </asp:RequiredFieldValidator> 
     <asp:RegularExpressionValidator ID="revName" runat="server" ControlToValidate="tbName" Display="none" ErrorMessage="文件名称的长度最大为50,请重新输入。" ValidationExpression=".{1,50}">
        </asp:RegularExpressionValidator> 
        <ajaxToolkit:TextBoxWatermarkExtender ID="wmeName" runat="server" TargetControlID="tbName" WatermarkText="请输入文件名称" WatermarkCssClass="Watermark">
        </ajaxToolkit:TextBoxWatermarkExtender>
        <ajaxToolkit:ValidatorCalloutExtender ID="vceNameBlank" runat="server" TargetControlID="rfNameBlank" HighlightCssClass="Validator">
        </ajaxToolkit:ValidatorCalloutExtender>
        <ajaxToolkit:ValidatorCalloutExtender ID="vceNameValue" runat="server" TargetControlID="rfNameValue" HighlightCssClass="Validator">
        </ajaxToolkit:ValidatorCalloutExtender>
        <ajaxToolkit:ValidatorCalloutExtender ID="vceNameRegex" runat="server" TargetControlID="revName" HighlightCssClass="Validator">
        </ajaxToolkit:ValidatorCalloutExtender>
        <ajaxToolkit:AutoCompleteExtender ID="aceName" runat="server" TargetControlID="tbName" ServicePath= "AjaxService.asmx" ServiceMethod="GetFileList" MinimumPrefixLength="1" CompletionInterval="100" CompletionSetCount="20">
       </ajaxToolkit:AutoCompleteExtender>
      </td>
    </tr> 
  </table>
  <asp:UpdatePanel ID="upbutton" runat="server">
    <ContentTemplate>
      <table class="Table" border="0" cellpadding="2" bgcolor="Black" cellspacing="1">
      <tr bgcolor="white">
      <td>&nbsp;</td>
      <td width="280%">        
      <asp:Button ID="btnCommit" runat="server" Text="开始搜索" SkinID="anniu" Width="100px" OnClick=
      "btnCommit_Click" />&nbsp;&nbsp;&nbsp;
      <asp:UpdateProgress ID="upProgress" runat="server" DisplayAfter="0" AssociatedUpdatePanelID="upbutton">
      <ProgressTemplate>
       <font color="red">正在搜索文件,请等待……</font> 
      </ProgressTemplate>
      </asp:UpdateProgress>

上述代码执行后,将首先显示一个信息搜索表单,如图18-3所示;如果输入的关键字为空,单击【开始搜索】按钮后,将显示对应的提示,如图18-4所示。

图片 421

图18-3 信息搜索表单效果图

图片 422

图18-4 为空提示效果图

搜索处理页面文件SearchFile.aspx.cs的功能是获取信息搜索表单中的搜索关键字,并将系统数据库中符合的信息检索出来。其运行流程如图18-5所示。

图18-5 搜索处理运行流程图

文件SearchFile.aspx.cs的主要实现代码如下。

  protected void Page_Load(object sender, EventArgs e)
  {
    //
  }
  private void ShowSearchResult()
  { //获取数据
    FileImage file = new FileImage();
    DataSet ds = file.GetFiles();
    if(ds == null || ds.Tables.Count <= 0 || ds.Tables[0].Rows.Count <= 0) return;
    if(string.IsNullOrEmpty(tbName.Text) == true) return;
    DataView dv = ds.Tables[0].DefaultView;
    dv.RowFilter = "Title LIKE '*" + tbName.Text + "*'";
    dv.Sort = "Title";
    //显示数据
    gvFile.DataSource = dv;
    gvFile.DataBind();
  }
  protected void btnCommit_Click(object sender,EventArgs e)
  {
    ShowSearchResult();
  }

搜索结果显示功能是由文件SearchFile.aspx实现的,其主要实现代码如下。

<tr bgcolor="white">
<td>搜索结果:&nbsp;</td>
<td width="280%">
    <asp:GridView ID="gvFile" runat="server" Width="100%" AutoGenerateColumns="False" SkinID="mm">
    <Columns>
    <asp:TemplateField HeaderText="文件名称">
       <ItemTemplate>
        <a href='<%#| "Files/" + Eval("Url") %>' target="_blank"><%#| Eval("Title") %></a>
       </ItemTemplate>
    <HeaderStyle HorizontalAlign="Left" />
      <ItemStyle HorizontalAlign="Left" Width="60%" />
    </asp:TemplateField>
      <asp:TemplateField HeaderText="文件类型">
       <ItemTemplate>
        <%#| Eval("Type") %>
       </ItemTemplate>
      <HeaderStyle HorizontalAlign="Center" />
       <ItemStyle HorizontalAlign="Center" Width="20%" />
      </asp:TemplateField>
      <asp:TemplateField HeaderText="文件大小">
       <ItemTemplate>
       <%#| (int)Eval("Size") / 1024 + "KB" %>
       </ItemTemplate>
      <HeaderStyle HorizontalAlign="Center" />
       <ItemStyle HorizontalAlign="Center" Width="20%" />
       </asp:TemplateField>
      </Columns>
     </asp:GridView>
    </ContentTemplate>          
   </asp:UpdatePanel>  
  </form>

上述代码执行后,当用户输入搜索关键字并单击【开始搜索】按钮后,系统将数据库中符合条件的数据以列表样式显示出来,如图18-6所示。

图片 424

图18-6 搜索结果显示效果图

搜索智能提示是指当用户在信息搜索表单中输入搜索关键字时,系统将自动显示和当前相关的搜索提示信息。本项目智能搜索功能是由文件AjaxService.cs实现的,其具体实现代码如下。

//引入新的命名空间
using System.Data;
using System.Web.Script.Services;
using AjaxControlToolkit;
using ASPNETAJAXWeb.AjaxFileImage;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//添加脚本服务
[System.Web.Script.Services.ScriptService()]
public class AjaxService : System.Web.Services.WebService
{
 public static string[] autoCompleteFileList = null;
  public AjaxService ()
 {
  }
 [System.Web.Services.WebMethod()]
 [System.Web.Script.Services.ScriptMethod()]
 public string[] GetFileList(string prefixText,int count)
 { //检测参数是否为空
   if(string.IsNullOrEmpty(prefixText) == true || count <= 0) return null;
   if(autoCompleteFileList == null)
   { //从数据库中获取所有文件的名称
    FileImage file = new FileImage();
    DataSet ds = file.GetFiles();
    if(ds == null || ds.Tables.Count <= 0 || ds.Tables[0].Rows.Count <= 0) return null;
    //将文件名称保存到临时数组中
    string[] tempFileList = new string[ds.Tables[0].Rows.Count];
    for(int i = 0; i < ds.Tables[0].Rows.Count; i++)
    {
      tempFileList[i] = ds.Tables[0].Rows[i]["Title"].ToString();
    }
    //对数组进行排序
    Array.Sort(tempFileList,new CaseInsensitiveComparer());
    autoCompleteFileList = tempFileList;
   }
   //定位二叉树搜索的起点
   int index = Array.BinarySearch(autoCompleteFileList,prefixText,new CaseInsensitiveComparer());
   if(index < 0)
   {
    index = ~index;
   }
   //搜索符合条件的文件名称
   int matchCount = 0;
   for(matchCount = 0; matchCount < count && matchCount + index < autoCompleteFileList.Length; matchCount++)
   {
    if(autoCompleteFileList[index+matchCount].StartsWith(prefixText,StringCom parison.CurrentCultureIgnoreCase) 
     ==false)
    {
      break;
      }
   }
    string[] matchResultList = new string[matchCount];
    if(matchCount > 0)
    { 
      Array.Copy(autoCompleteFileList,index,matchResultList,0,matchCount);
    }
    return matchResultList;
  }
}

在上述实现过程中,事件GetFileList是整个过程的核心,事件GetFileList的运行流程如图18-7所示。

图18-7 GetFileList事件运行流程图

上述代码执行后,将实现搜索信息自动提示功能。例如,在信息搜索表单中输入关键字“我”后,系统将自动显示“我”关键字相关的搜索提示,如图18-8所示。

图片 426

图18-8 搜索信息自动提示效果图

到此为止,在线信息搜索项目全部设计完毕。项目文件在Visual Studo 2012资源管理器中的效果如图18-9所示。

图片 427

图18-9 实例资源管理器效果图


教程类别