26
2019.2
设置路由
作者: POPASP
POPASP设置路由简单方便,下面我们先从一个例子开始入手。
控制器文件Controller/Index.asp
```brush:vb
<%
Class Index
sub route
that.d("datetime") = now()
that.show
end sub
End Class
%>
```
模板文件Tpl/route.html
```brush:html
{$datetime}
```
访问
```
http://serverName/index.asp?c=index&a=route
```
会看到浏览器输出当前时间。下面我们将配置文件Conf/config.asp文件的头部加入以下代码:
```brush:vb
POP_MVC.config( "URL_MODE" ) = -1
POP_MVC.config( "URL_RULE" ) = array( _
Array( "^route$" , "a" ) _
)
```
访问
```
http://serverName/index.asp?route
```
与前面没有使用路由的普通URL结果一致,只是两次时间不同,可以看出来,达到了路由的分发目的。配置参数`URL_RULE`是匹配规则,它对应的是一个二维数组,二维数组还被POPASP巧妙地使用到了模型的自动完成与自动验证功能。
如果有多个action方法,我们可以把规则添加到`POP_MVC.config( "URL_RULE" )`中。比如控制器控制器文件Controller/Index.asp有多个方法
```brush:vb
<%
Class Index
sub route
'其他代码省略
that.show
end sub
sub action1
'其他代码省略
that.show
end sub
sub action2
'其他代码省略
that.show
end sub
End Class
%>
```
这时候,我们就要多添加几个方法
```brush:vb
POP_MVC.config( "URL_RULE" ) = array( _
Array( "^route$" , "a" ) _
,Array( "^action1$" , "a" ) _
,Array( "^action2$" , "a" ) _
)
```
二维数组中每一个一维数组,都对应一条匹配规则,比如第一条,它会把地址
```
http://serverName/index.asp?route
```
中的参数`route`,赋值给`a`,也就相当于`a=route`。而`^route$`是一个正则表达式,它匹配字符串"route",前后不能再有字符。如果想用一条匹配规则代替上面的三条,可以使用
```brush:vb
POP_MVC.config( "URL_RULE" ) = array( _
Array( "^route|action1|action2$" , "a" ) _
)
```
如果有更多的不确定方法,我们可以使用
```brush:vb
POP_MVC.config( "URL_RULE" ) = array( _
Array( "^\w+$" , "a" ) _
)
```
我们会发现POPASP的路由使用了简单的正则表达式,如果您不会正则,那还是请您先简单学一些正则的基础知识,再回来学习。
### 使用配置URL_DEPR分割多个参数
如果要分割多个参数,需要先指定配置参数URL_DEPR,比如官网上的地址
```brush:html
http://www.popasp.com/?list/8
```
它其实对应的是网址
```brush:html
http://www.popasp.com/?a=list&page=8
```
我们需要在配置文件中,这样指定
```brush:vb
'URL_DEPR用来指定参数分割符
POP_MVC.config( "URL_DEPR" ) = "/"
POP_MVC.config( "URL_RULE" ) = array( _
Array( "^list/\d+$" , "a/page" ) _
,Array( "^\w+$" , "a" ) _
)
```
系统将请求地址中的参数`list/8`与匹配规则进行逐条匹配,如果发现相匹配项,则会使用分割符将其进行分割,`list/8`会分割成`list`与`8`,并将数组中的第二项进行分割成`a`与`page`,并进行赋值
```brush:html
POP_MVC.dQuery("a") = "list"
POP_MVC.dQuery("a") = 8
```
系统中的赋值,是采用了中间量POP_MVC.dQuery。
如果输出`Request.QueryString`,得到的是`list/8`,那么我们如何取值呢?
### 使用POP_MVC.get()来取参数
使用了路由模式,原来的Request.QueryString取参数值不会有效,我们要使用使用POP_MVC.get()来获取地址栏参数。比如上例:
```brush:vb
dim page
page = POP_MVC.get("page")
```
### 用第三个参数来指定默认值
前面的例子都没有指定控制器名称,是由于系统默认采用的是控制器`Index`,如果有多个控制器,我们想进行有效的区分,此时就需要指定第3个参数。
比如:
```brush:vb
'URL_DEPR用来指定参数分割符
POP_MVC.config( "URL_DEPR" ) = "/"
POP_MVC.config( "URL_RULE" ) = array( _
Array( "^list/\d+$" , "a/page","c=index" ) _
,Array( "^\w+$" , "a","c=index" ) _
)
```
第3个参数的指定,遵循原则是按照地址栏普通URL中的参数配置模式书写。比如上面,我们想再加一条,比如
```brush:vb
'URL_DEPR用来指定参数分割符
POP_MVC.config( "URL_DEPR" ) = "/"
POP_MVC.config( "URL_RULE" ) = array( _
Array( "^list/\d+$" , "a/page","c=index" ) _
,Array( "^list$" , "a","c=index&page=1" ) _
,Array( "^\w+$" , "a","c=index" ) _
)
```
通过`c=index&page=1`这样的分配参数,来指定参数的默认值。
下面,我们以iaspcms的后台路由配置为例,给大家学习提供参考。
```brush:vb
POP_MVC.config( "URL_MODE" ) = -1
POP_MVC.config( "URL_DEPR" ) = "/"
POP_MVC.config( "URL_RULE" ) = array( _
Array( "^content/[1-9]\d*$" , "c/SortType" , "a=list" ) _
,Array( "^content_edit/[1-9]\d*/[1-9]\d*$" , "/SortType/id" , "c=Content&a=edit" ) _
,Array( "^content_recycle/[1-9]\d*$" , "/id" , "c=Content&a=do_recycle" ) _
,Array( "^AdminGroup$" , "" , "c=Usergroup&a=list&IsAdmin=1" ) _
,Array( "^Usergroup$" , "" , "c=Usergroup&a=list&IsAdmin=0" ) _
,Array( "^admin$" , "" , "c=User&a=list&IsAdmin=1" ) _
,Array( "^user$" , "" , "c=User&a=list&IsAdmin=0" ) _
,Array( "^make/html$" , "" , "c=html&a=list&act=html" ) _
,Array( "^make/map$" , "" , "c=html&a=list&act=map" ) _
,Array( "^make/rss$" , "" , "c=html&a=list&act=rss" ) _
,Array( "^adv/floated$" , "" , "c=Adv&a=floated" ) _
,Array( "^adv/couplet$" , "" , "c=Adv&a=couplet&AdvContent=1" ) _
,Array( "^adv/window$" , "" , "c=Adv&a=window" ) _
,Array( "^Setting/site$" , "" , "c=Setting&a=configs&GroupID=1,2" ) _
,Array( "^Setting/notice$" , "" , "c=Setting&a=configs&GroupID=3,4,5" ) _
,Array( "^Setting/order$" , "" , "c=Setting&a=configs&GroupID=6,7,8" ) _
,Array( "^Setting/cache$" , "" , "c=Setting&a=configs&GroupID=13" ) _
,Array( "^System/safe$" , "" , "c=Setting&a=configs&GroupID=15" ) _
,Array( "^switch_language/[1-9]\d*$" , "a/id" , "c=Index" ) _
,Array( "^\w+\/\w+$" , "c/a" ) _
,Array( "^\w+$" , "c" , "a=list" ) _
)
```