如何解析SharePoint搜索中心网站的精简过滤参数(r参数)
在SharePoint搜索中心网站,有时候,我们需要使用自定义代码,对用户正在进行的搜索操作,进行一些额外的处理。比如,在一个自定义Web部件中,根据用户的搜索关键字,执行一些特定操作。这个时候,我们需要根据URL中的参数,来解析出用户所使用的关键字和其他搜索参数。
如果只是要得到搜索关键字本身,是非常简单的。稍微观察一下URL,就能立刻了解到,k这个参数的值,就是用户所使用的搜索关键字。在代码中,只需要对它进行一下url decode操作即可。
但是,如果用户使用了精简面板(就是搜索结果页面左侧,那个可以通过结果类型、来源进行过滤的面板)来对搜索结果进行过滤,那么要在URL中,解析出用户所使用的精简参数,就不那么容易了。(我以前曾经写过一篇文章,为SharePoint搜索创建自定义优化参数,介绍了如何对精简面板进行自定义。)
首先观察一下URL,会发现多了一个r参数。这个参数就是用户点击了左侧的精简面板后,所生成的一个精简参数。
分析r参数的值,format%3D%22AQ5NaWNyb3NvZnQgV29yZAZmb3JtYXQBAl4iAiIk%22,你应该也能想到这个肯定进行过url编码。所以第一步,先对r参数的值进行url decode操作。然后你会得到这样一个值:format="AQ5NaWNyb3NvZnQgV29yZAZmb3JtYXQBAl4iAiIk"。
这个精简参数的前半段,format=,很容易理解,format是一个托管属性。那么等号右侧的值又应该如何进一步解析呢?看到这些字母加上数字的组合,略加猜测,你应该能想到这是一个进行了Base64编码的字符串。
OK,对AQ5NaWNyb3NvZnQgV29yZAZmb3JtYXQBAl4iAiIk进行一下Base64反编码,哇,果然,你就得到了一个更容易理解的字符串,不过,这个字符串如果显示出来,会有些怪怪的:
这到底是一个什么格式的字符串呢?经过仔细分析,这其实是一个如下格式的字符串(竖线符号仅仅用来做让它显示起来更清楚,字符串中并不包含):
一个不需要关心的Char | 一个表示属性值的长度的数字转化后的Char | 真正有用的属性值 | 一个表示属性名称的长度的数字转化后的Char | 属性名称 | 两个不需要关心的Char | ^字符 | 双引号字符 | 一个不需要关心的Char | 双引号字符 | $字符
其实我们需要的,只是里面的那个“真正有用的属性值”。所以,你只要在代码中跳过两个Char,然后再找到属性名称(在我们的例子中,也就是前面那个format),从这个位置再往前一个Char,最后得到的就是你需要的属性值了。于是,最后我们就得到了这个精简参数的定义:format=”Microsoft Word”。
如果用户在精简面板上点击了多个精简参数,那么URL中r参数的值进行url decode之后,会使用空格符分成多个字符串,分别按照上面的规则分别解析即可。