首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

SharePoint 2010 搜尋核心結果 Web 部件擴充:打造可排序的自訂搜尋體驗

     編輯:關於.NET

前言

SharePoint 2010 內建搜尋 Web 部件(核心結果、最佳比對、精簡面板等)已滿足大多數需求,但超級使用者與開發人員仍可透過繼承 `CoreResultsWebPart` 建立客製化搜尋體驗。本文完整示範:繼承核心結果 Web 部件、自訂資料來源與檢視、覆寫 `AddSortOrder` 實現多欄位排序、建立 EditorPart 限制可排序欄位、部署與效果驗證。

一、架構概覽:三層擴充點

  1. WebPart 類別:繼承 `CoreResultsWebPart`,覆寫 `CreateChildControls`、`CreateDataSource`
  2. DataSource 類別:繼承 `CoreResultsDatasource`,指定自訂 `View`
  3. DataSourceView 類別:繼承 `CoreResultsDatasourceView`,核心查詢邏輯覆寫 `AddSortOrder`、`GetData` 等

二、程式碼實作

2.1 WebPart 進入點

[ToolboxItem(false)]
public class MSDNSample : CoreResultsWebPart
{
    public MSDNSample() { } // 序列化必要

    protected override void CreateChildControls()
    {
        base.CreateChildControls();
        // 加入自訂 UI 控制項(如排序下拉清單)
    }

    protected override void CreateDataSource()
    {
        // base.CreateDataSource();
        this.DataSource = new MyCoreResultsDataSource(this);
    }
}

2.2 自訂 DataSource


public class MyCoreResultsDataSource : CoreResultsDatasource
{
    public MyCoreResultsDataSource(CoreResultsWebPart parent) : base(parent)
    {
        this.View = new MyCoreResultsDataSourceView(this, "MyCoreResults");
    }
}

2.3 核心 View:排序邏輯


public class MyCoreResultsDataSourceView : CoreResultsDatasourceView
{
    public MyCoreResultsDataSourceView(SearchResultsBaseDatasource owner, string viewName)
        : base(owner, viewName)
    {
        if (owner == null) throw new ArgumentNullException("owner");
        var ds = owner as MyCoreResultsDataSource;
        this.QueryManager = SharedQueryManager.GetInstance(ds.ParentWebpart.Page).QueryManager;
    }

    public override void AddSortOrder(SharePointSearchRuntime runtime)
    {
        if (runtime.KeywordQueryObject == null) return;

        runtime.KeywordQueryObject.SortList.Clear(); // 移除預設排序

        var wp = this.DataSourceOwner.ParentWebpart as SearchResultsPart;
        string sortField = wp.SortFields; // 來自 EditorPart 設定

        if (!string.IsNullOrEmpty(sortField))
        {
            if (wp.Page.IsPostBack)
            {
                // 使用者在頁面選擇的欄位與方向
                string field = wp.Page.Request.Form[SearchResultsPart.mFormSortField];
                SortDirection dir = wp.Page.Request.Form[SearchResultsPart.mFormSortDirection] == "ASC"
                    ? SortDirection.Ascending : SortDirection.Descending;
                runtime.KeywordQueryObject.SortList.Add(field, dir);
            }
            else
            {
                // 預設取第一個欄位,降序
                string[] fields = sortField.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                runtime.KeywordQueryObject.SortList.Add(fields[0], SortDirection.Descending);
            }
        }
        else
        {
            base.AddSortOrder(runtime); // 回退預設
        }
    }
}

三、可排序欄位條件

只有符合下列條件的受管理屬性可用於排序:

  • 資料型別為 DateTime 或 Numeric
  • 或為 Text 且 `HasMultipleValues = false`、`IsInDocProps = true`、`MaxCharactersInPropertyStoreIndex > 0`

四、自訂 EditorPart 限制可選欄位

  • 繼承 `EditorPart`、實作 `IWebEditable`
  • 使用 LINQ 查詢搜尋結構:`SearchSchemaManager` 取得受管理屬性集合
  • 篩選符合排序條件的屬性綁定至 DropDownList
  • 儲存至 WebPart 自訂屬性 `SortFields`(分號分隔)

程式碼結構與 SharePoint 2007 相同,此處略過細節。

五、部署與驗證

  1. 建立 SharePoint 2010 專案(Visual Studio 2010)
  2. 加入 WebPart 項目,貼上上述類別
  3. 建立 `.webpart` 定義檔,設定 `TypeName`、標題、描述
  4. 封裝 `.wsp`,PowerShell `Add-SPSolution` / `Install-SPSolution`
  5. 網站集合功能啟用「搜尋伺服器 Web 部件」
  6. 編輯搜尋結果頁面,加入自訂 Web 部件
  7. 編輯 Web 部件屬性 → 選擇可排序欄位

六、執行效果

排序欄位與方向選擇 WebPart 屬性編輯

七、進階延伸方向

  • 查詢記錄:`QueryManager` 記錄使用者查詢關鍵字
  • 查詢物件模型:`KeywordQuery` 直接呼叫搜尋服務
  • 精簡面板客製化:繼承 `RefinementPanel`
  • 最佳比對:`BestBetsWebPart`

結語

透過繼承 `CoreResultsWebPart` 三層架構,僅覆寫核心排序邏輯即可賦予搜尋結果彈性排序能力,並搭配 EditorPart 提供使用者友善設定介面。此模式同樣適用於分頁、群組、自訂排名模型等進階搜尋客製化需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved