演练:使用联合对象模型创建基本搜索 Web 部件

上次修改时间: 2010年4月30日

适用范围: SharePoint Server 2010

本文内容
设置 Web 部件项目
实现 Web 部件
部署并测试 Web 部件

在 Microsoft SharePoint Server 2010 中,您可以从浏览器自定义搜索中心页和 Web 部件的外观和功能。不过,如果要以不能通过浏览器实现的方式自定义这些页或 Web 部件,可以创建使用查询对象模型或联合对象模型的自定义 Web 部件来执行搜索查询。

在本演练中,您将创建一个执行关键字查询并显示使用联合对象模型返回的搜索结果的自定义 Web 部件。有关演示如何使用查询对象模型创建自定义搜索 Web 部件的示例,请参阅演练:使用查询对象模型创建基本搜索 Web 部件

可以在代码示例:自定义联合搜索 Web 部件代码中找到 CustomFederatedSearch Web 部件示例的完整代码。

备注

本演练中介绍的 Web 部件提供非常基本的搜索功能。

本演练执行以下任务:

  • 设置 Web 部件项目

  • 实现 Web 部件

  • 部署并测试 Web 部件

先决条件

若要执行此演示,您必须在开发计算机上安装以下各项:

  • Microsoft SharePoint Server 2010

  • Microsoft Visual Studio 2010 或类似的与 Microsoft .NET Framework 兼容的开发工具

设置 Web 部件项目

为 Web 部件创建项目

  1. 在 Visual Studio 2010 中的"文件"菜单上,指向"新建",然后单击"项目"。

  2. 在"项目类型"中,在"C#"下选择"SharePoint"。

  3. 在"模板"之下,选择"空白 SharePoint 项目"。在"名称"字段中键入 CustomFederatedSearch,然后单击"确定"。

  4. 在"SharePoint 自定义向导"中,单击"部署为场解决方案",然后单击"完成"。

接下来,必须向您的 Web 部件项目添加需要的引用。

向 Web 部件项目添加引用

  1. 在"项目"菜单上,单击"添加引用"。

  2. 在".NET"选项卡上,选择以下每个引用,然后在选择每个后单击"确定":

    • Microsoft.Office.Server

    • Microsoft.Office.Server.Search

在为 Web 部件添加代码之前,必须将 Web 部件类文件添加到项目,然后将 using 语句添加到类。

向项目中添加 Web 部件类

  1. 在"项目"菜单上,单击"添加新项"。

  2. 在"添加新项"对话框中单击"Web 部件",键入 Custom Federated Search,然后单击"添加"。

  3. 将以下命名空间指令添加到类开头。

    using System.Data;
    using System.Xml;
    using Microsoft.Office.Server.Search.Query;
    using Microsoft.Office.Server.Search.Administration;
    

实现 Web 部件

现在可以编写代码来执行查询,然后呈现返回的搜索结果。

添加 Web 部件的子控件并呈现它们

  1. 将以下代码添加到 Custom_Federated_Search 类声明下。

    Button queryButton;
    TextBox queryTextBox;
    Label resultsLabel;
    DataGrid resultsGrid;
    
  2. 在 CreateChildControls 方法中,添加代码以初始化控件,如下所示。

    protected override void CreateChildControls()
    {
         Controls.Clear();
         queryTextBox = new TextBox();
         this.Controls.Add(queryTextBox);
         queryButton = new Button();
         queryButton.Text = "Start Search";
         queryButton.Click += new EventHandler(queryButton_Click);
         this.Controls.Add(queryButton);
         resultsLabel = new Label();
         this.Controls.Add(resultsLabel);
    }
    
  3. 使用以下代码为 queryButton 添加单击事件。

    void queryButton_Click(object sender, EventArgs e)
    {
         if (queryTextBox.Text != string.Empty)
         {
              ExecuteFederatedQuery(queryTextBox.Text);
         }
         else
         {
              resultsLabel.Text = "You must enter a search word.";
         }
    }
    
  4. 为 ExecuteFederatedQuery 方法添加以下代码。

    void ExecuteFederatedQuery(string queryText)
    {
         long lastupdate;
         bool crawl;
    
         SearchServiceApplicationProxy proxy = (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy
    (SPServiceContext.GetContext(SPContext.Current.Site));
         LocationConfiguration[] locationConfigs;
         LocationConfiguration locationConfig = null;
         locationConfigs = proxy.GetLocationConfigurations(out lastupdate, out crawl);
         Location location;
         LocationList locationList = new LocationList();
         QueryManager queryManager = new QueryManager();
         foreach (LocationConfiguration locConfig in locationConfigs)
         {
              if (locConfig.InternalName.Equals("LocalSearchIndex"))
              {
                   locationConfig = locConfig;
                   break;
              }
         }
         location = new Location(locationConfig.InternalName, proxy);
         location.UserQuery = queryText;
         locationList.Add(location);
         queryManager.Add(locationList);
         queryManager.IsTriggered(locationList);
         XmlDocument xDoc = queryManager.GetResults(locationList);
         DataSet resultSet = new DataSet();
         resultSet.ReadXml(new XmlNodeReader(xDoc));
         FillResultsGrid(resultSet.Tables[1]);
    }
    
  5. 为 FillResultsGrid 方法添加以下代码。

    private void FillResultsGrid(DataTable resultTable)
    {
         //Instantiate the DataGrid
         resultsGrid = new DataGrid();
         //Set the DataSource
         resultsGrid.DataSource = resultTable;
         //Bind the data to the DataGrid
         resultsGrid.DataBind();
         //Add the DataGrid to the controls
         Controls.Add(resultsGrid);
    }
    

现在即可部署 Web 部件。

部署并测试 Web 部件

部署 Web 部件

  1. 在"生成"菜单上,单击"部署解决方案"。

    部署过程执行以下操作:

    • 生成 Web 部件 DLL 并将其部署到全局程序集缓存中。

    • 创建 Web 部件并将其部署到网站中。

    • 回收 Internet Information Services (IIS)。

    更改项目后重新选择"部署解决方案"可自动收回以前版本的解决方案并使用最新版本替换它。

  2. 从浏览器导航到要向其中添加 Web 部件的 Web 部件页。

  3. 单击"网站操作"选项卡,然后单击"编辑页面"。

  4. 在任意 Web 部件区域单击"添加 Web 部件"。

  5. 在"类别"中,单击"自定义"。

  6. 在"Web 部件"中,单击"自定义联合搜索",然后单击"添加"。

  7. 单击"保存并关闭"。验证自定义联合搜索 Web 部件是否显示在页上。

测试 Web 部件

  1. 在文本框中键入搜索词,然后单击"开始搜索"。

  2. 在 Visual Studio 2010 中,在"项目"菜单上单击"CustomFederatedSearch 属性"。

  3. 在"调试"选项卡上的"启动操作"部分,单击"使用 URL 启动浏览器",然后键入向其中添加 Web 部件的 Web 部件页的 URL。关闭"属性"页。

    完成此步骤后,可以在 Web 部件代码中设置断点,然后通过单击"调试"菜单上的"F5"来启动调试。