using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;

namespace BookDemo.QA
{
public partial class SearchResult2 : System.Web.UI.Page
{
    //搜索关键字
    protected string KeyWord { get; set; }
    //URL编码后的关键字
    protected string KeyWordUrlEnCode { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            return;//如果是回传，则返回，不继续执行下面的代码
        }

        if (!string.IsNullOrEmpty(Request.QueryString["kw"]))
        {
            KeyWordUrlEnCode = Request.QueryString["kw"];//原始的URL编码过的关键字
            KeyWord = Server.UrlDecode(Request.QueryString["kw"].Trim());//URL解码后的关键字
        }

        //过滤
        if (!string.IsNullOrEmpty(Request.QueryString["kw"]))
        {
            KeyWord = Server.UrlDecode(Request.QueryString["kw"].Trim());//URL解码后的关键字
            Master.Keyword = KeyWord;//设置母版页关键字
            lblKeyword.Text = KeyWord;//显示关键字

            //过滤关键字：'&$#@!~<>=,/|\
            //转义关键字： .$ ^ { [ ( | ) * + ? \ 
            Regex regexFilter = new Regex(@"(['&$#@!~<>=,/|\\])");//需要过滤的关键字
            Regex regexKey = new Regex(@"([.$^{[(|)*?])");//需要转义的正则表达式符号,允许加号
            KeyWord = regexFilter.Replace(KeyWord, "");//替换禁止查询字符
            KeyWord = regexKey.Replace(KeyWord, @"\$1");//替换关键字转义
            KeyWordUrlEnCode = Server.UrlDecode(KeyWord);//原始的URL编码过的关键字
        }

        //处理关键字
        List<string> keywords = KeyWord.Split(new string[] { " ", "+" }, StringSplitOptions.RemoveEmptyEntries).ToList();
        DateTime dtStartSearch = DateTime.Now;//开始搜索时间
        QuestionAndAnswersCache qaCache = new QuestionAndAnswersCache();
        List<QuestionAndAnswers> result = qaCache.SearchQuestionByKeyWord(keywords);
        DateTime dtFinishSearch = DateTime.Now;//搜索结束时间
        lblSearchCost.Text = (dtFinishSearch - dtStartSearch).TotalMilliseconds.ToString();
        lblKeyword.Text = KeyWord;//显示关键字

        //显示结果条数
        //注：如果用到了分页，这里不能直接从result.Count获取总共记录的条数
        lblResultCount.Text = result.Count.ToString();
        
        rptResult.DataSource = result;//将result作为rptResult的数据源
        rptResult.DataBind();//将数据绑定到rptResult上
    }
}
}
