Voyager 中可以通过各种方式传递参数。
通过地址传参是最常用的传递数据的方式,在 Voyager 中处理参数非常简单。
例如地址/carton/page?id=1&name=Tom&age=18
。
一种方法是通过PQL参数占位符 #{name}
,可以在页面的任何地方使用,包括服务器端代码,比如:
另一种方法是通过 PQL 变量,Voyager 会把所有的地址参数转成变量,例如上面地址会生成3
个变量:
注意所有参数变量的数据类型都为文本字符串。
母版页地址中可以传递参数目的是为了定制出不同的母版页,字符冲突时需要将特殊字符进行编码,见本文后面的说明
同样,服务器端包含文件也可以带参数,目的也是为了定制引入页或页面上的内容。
参数值中与地址参数常用符号冲突时需要进行编码,见本文后面的说明。#{id}
是页面地址中的参数。
有时我们传递的参数会很多,这时如果通过母版页或服务器端包含这两种方式以 Query String 的格式传递参数的话,地址会写的非常长,不容易阅读。这种情况下可以以 Json 对象方式传递参数。
以上配置可以写在页面的任意位置,建议写在母版页或服务器端包含之后,如果没有母版页或服务器端包含,可以写在页面顶部。这种方式配置参数的好处一是直观,可读性强;二是特殊字符不需要编码;三是传递的参数可区分数据类型。
注意开始的@
符号不能省略,类似 Asp.net 的 Razor 语法规则,并且结尾的}
后面要回行。这里支持参数占位符,如上例中的#{id}
。极端情况下,有可能会因为参数值中有不配对的大括号{
或}
出现解析错误,这时可以考虑把值中的大括号替换成 URL 编码:{
对应%7B
,}
对应%7D
。
在上述三种方式的传参方式中,不论是以查询字符串的形式传参还是以 Json 方式传参,参数值里面都不能包含服务器端标记,如<%=$id%>
。因为母版页、服务器端包含和 Json 传参其本身就是在服务器端解析和运行的代码。
母版页和服务器端中与地址参数冲突的字符需要进行 URL 编码,对应表如下:
?
,使用%3F
代替=
,使用%3D
代替&
,使用%26
代替
,使用%20
代替/
,使用%2F
代替,大多数情况下不必要%
,使用%25
代替{
,使用%7B
代替}
,使用%7D
代替在 Voyager,可以通过以上三种形式接收地址中的参数。这些参数可以在页面、母版页、服务器端包含文件 任何地方 以本文开头提到的两种方式使用,即每个参数的作用域是全局的,而不是针对于母版页或某一个服务器端包含文件,所以这些参数不建议使用相同的名字。如果使用了相同的名字,比如页面地址有name
参数,母版页中也有name
参数,服务器端包含文件中也有name
参数,那么最后name
的值是服务端包含文件参数中设定的值,即服务器端包含文件优先级最高,其次是母版页,最后是页面地址参数。
特别说明一点,页面地址中的参数可以传递给母版页和服务器端包含文件,例如有地址/list?id=2
,页面中有:
上例中,#{id}
部分会被替换为2
。
另外,PQL 参数处理逻辑在 Voyager 中同样适用,如参数变量等。
参考链接