程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> SharePoint 2010開發實例精選:可排序的搜索核心結果

SharePoint 2010開發實例精選:可排序的搜索核心結果

編輯:關於.NET

雖然對於信息工作者來說SharePoint 2010開箱即用的搜索界面已經非常直觀並易用,但作為超級用戶仍然可以創建屬於自己的搜索體驗。SharePoint Server 2010包括了許多與搜索相關的強大的Web部件,用於支持超級用戶定制搜索體驗,包括搜索最佳匹配,精簡面板,搜索核心結果,相關查詢等等。下圖為標准的搜索類WebPart。

IT Pros或Developers可以配置內置的搜索Web部件來定制搜索體驗。作為開發人員,你也可以擴展這些WebPart,來改變搜索結果頁上內置搜索WebPart的行為。只需要在現有基礎上進行繼承並擴展,無需創建新的WebPart。

此外,我們還可以在定制搜索WebPart時使用查詢日志記錄,以及隨時通過查詢對象模型訪問搜索服務。

例子:擴展搜索核心結果Web部件

讓我們用Visual Studio 2010創建一個新的搜索WebPart。本例中的WebPart繼承自CoreResultsWebPart,並從一個自定義的源中顯示數據。標准的搜索核心結果WebPart包括一個構造函數和兩個方法,我們將在本例中對其進行修改。

第一步是新建一個WebPart類。創建一個新的WebPart項目並繼承自CoreResultsWebPart類。覆寫 CreateChildControls來添加界面所需的任何控件,然後覆寫CreateDataSource。這是我們操作查詢的入口。在覆寫中,我們將創建一個稍後創建的自定義數據源類的實例。 

class MSDNSample : CoreResultsWebPart
{
     public MSDNSample()
     {
         //默認構造器:支持為了序列化所以必須存在
     }
     protected override void CreateChildControls()
     {
         base.CreateChildControls();
         //在此處添加界面上用到的控件
     }
     protected override void CreateDataSource()
     {
         //base.CreateDataSource();
         this.DataSource = new MyCoreResultsDataSource(this);
     }

第二步是創建一個新類繼承自CoreResultsDatasource類。在CreateDataSource的覆寫中,會設置 DataSource屬性為該類。在CoreResultsDataSource構造器中,創建一個稍後創建的自定義數據源視圖類的實例。至此,無需再覆寫其他任何內容了。

public class MyCoreResultsDataSource : CoreResultsDatasource
{
     public MyCoreResultsDataSource(CoreResultsWebPart ParentWebpart)
         : base(ParentWebpart)
     {
         //如果在這裡我們需要引用該WebPart的屬性或方法
         //那麼可以通過 ParentWebPart 參數獲取
         //創建將用於此數據源的視圖
         this.VIEw = new MyCoreResultsDataSourceView(this, "MyCoreResults");
     }
}

第三步是創建一個新類繼承自CoreResultsDatasourceView類。設置你的CoreResultsDatasource的 View屬性為該新類。在CoreResultsDatasourceView的構造器中,獲取一個引用到CoreResultsDatasource,以便你可以返回到該webpart。然後,設置QueryManager屬性以便共享頁面中使用的查詢管理器。

public class MyCoreResultsDataSourceView : CoreResultsDatasourceView
{
     public MyCoreResultsDataSourceView(SearchResultsBaseDatasource DataSourceOwner, string ViewName)
                     : base(DataSourceOwner, ViewName)
     {
         //確保datasource有值
         if (DataSourceOwner == null)
         {
             throw new ArgumentNullException("DataSourceOwner");
         }
         //獲取一個到我們datasource的類型引用
         MyCoreResultsDataSource ds = this.DataSourceOwner as MyCoreResultsDataSource;
         //為該視圖配置查詢管理器
         this.QueryManager = SharedQueryManager.GetInstance(ds.ParentWebpart.Page).QueryManager;
     }

現在,我們完成了一個從自定義數據源顯示數據的WebPart。接下來,我將在其中添加一些定制查詢處理。

例子:為你的WebPart添加排序功能

毫無疑問我們可以在CoreResultsDataSourceView類中修改查詢的方方面面。其中首要的是對AddSortOrder的覆寫。該類可以提供對SharePointSearchRuntime類的訪問,借助此類,可以得到:KeyWordQueryObject,Location 和RefinementManager。

下面的樣例代碼在AddSortOrder覆寫中添加了排序功能。

public override void AddSortOrder(SharePointSearchRuntime runtime)
     {
         //確保我們的運行時已妥善實例化
         if (runtime.KeywordQueryObject == null)
         {
             return;
         }
         //刪除任何可能存在的其他字段上的排序
         runtime.KeywordQueryObject.SortList.Clear();
         //獲取該datasource以便得到該webpart並獲取用戶所選擇的排序字段
         SearchResultsPart wp = this.DataSourceOwner.ParentWebpart as SearchResultsPart;
         string sortField = wp.SortFields;
         //檢查是否已經提供了排序字段
         if (!string.IsNullOrEmpty(sortField))
         {
             //如果是頁面提交則使用排序下拉框中的值
             if (wp.Page.IsPostBack)
             {
                 //獲得下拉框中所選的排序方向
                 SortDirection dir =
                     (wp.Page.Request.Form[SearchResultsPart.mFormSortDirection] == "ASC" ?
                     SortDirection.Ascending : SortDirection.Descending);
                 //配置該排序列表,添加排序字段和排序方向
                 runtime.KeywordQueryObject.SortList.Add(wp.Page.Request.Form[SearchResultsPart.mFormSortField],
                     dir);
             }
             else
             {
                 //以分隔符來拆分該值,並取出第一項按降序排列
                 string[] values = sortField.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                 runtime.KeywordQueryObject.SortList.Add(values[0], SortDirection.Descending);
             }
         }
         else  //如果沒有提供排序字段則使用默認排序順序
             base.AddSortOrder(runtime);

其中本例中使用了KeywordQueryObject類。該類提供了訪問關鍵字查詢屬性的接口,比如:

EnableFQL RowLimit EnableNicknames SearchTerms EnablePhonetic SelectProperties EnableStemming SortList Filter StartRow QueryInfo SummaryLength QueryText TrimDuplicates Refiners . . . 

為了在我們的webpart中改變排序順序,首先需要刪除默認的排序順序。然後獲取一個該webpart的引用,因為可以從中得到排序字段的屬性值。如果頁面posbback,則取到用戶在當前頁中選擇的排序字段。否則,使用用戶在配置webpart屬性時選擇的第一個排序字段。最後,將排序字段添加到SortList屬性。

為了可以排序,你還需要列出可供排序的字段。 DateTime類型的字段,Numeric類型的字段,以及HasMultipleValues=false,IsInDocProps=true,並且MaxCharactersInPropertyStoreIndex>0的Text類型的字段,都可以用於排序。

你可以通過創建一個自定義webpart屬性編輯器來限制用戶只能從指定的字段中進行選擇。這部分的代碼和SharePoint 2007裡一樣:繼承自EditorPart並實現IWebEditable接口。在附帶的樣例代碼中,我們的EditorPart使用標准的LINQ方式訪問搜索架構,來查找屬性。 

運行結果

排序字段與排序方向選擇:

WebPart屬性編輯,其中包括可排序字段的選擇和附加的一個查詢條件: 

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved