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" ) _ ) ```