建立自己的 MVC portal (四)

阅读:493 2019-03-19 14:42:56 来源:新网

前面我们介绍了如何实现一个可以支持多站点不同url转换的route,这里我们将实现一个继承于siteroutebase的实例,也就是说,在这里我们将实例化第一个进行url转换的实例代码。首先我们先回顾一下平台route的工作机制:

在找到站点后,系统会直接调用站点指定的url转换器的实例类,完成url的转换或组成可访问的虚拟url,首先,我们先了解一下siteroutebase

///

///站点级url解析基类///publicabstractclasssiteroutebase{//////分解url得到controller和action,将分解结果写到routedata中//////没有siteurl的访问地址///publicabstractboolgetroutedata(routedatadata,stringaccessurl);//////根据参数得到外部访问地址,与getroutedata相对应////////////publicabstractvirtualpathdatagetvirtualpath(vonportalrouteroute,requestcontextrequestcontext,routevaluedictionaryvalues);}

publicabstractboolgetroutedata(routedatadata,stringaccessurl);

这个是解释虚拟url到controller/action的转换器,这里移动有两个参数,routedatadata,存放转换结果,stringaccessurl是不含网站url头的访问网址,例如:如果站点的url为http://localhost:1234,当你访问http://localhost:1234/admin/userlist时,系统在执行时根据url头http://localhost:1234信息就可以找到实际的访问站点了,并将地址进行截取,将站点的实际访问信息,即“admin/userlist”发送给站点url转换的实例类来处理。

这样我们就可以建立多种实例类来解释,例如:以斜线作为分隔符的,也可以以下划线作为分隔符的,同样也可以通过其他方式进行的,从而完成不同站点不同解析的目的。

例如:http://localhost:1234/admin/userlist和http://localhost:5555/admin_userlist访问的内容是一样的,只是访问的url表现是不一样的,系统同样会根据站点设置截取掉url头信息,将后面的访问信息通过站点route的实例,调用其getroutedata函数完成url的转换,上述两个网址如果是针对http://localhost:1234和http://localhost:5555两个网站的话,其调用route实例的转换函数就是getroutedata(routedata,"admin/userlist")和getroutedata(routedata,"admin_userlist")了,由转换器自己来完成最终的解释。

好了!我们来实现第一个自己的route:

我们先新建一个类工程

usingsystem.collections.generic;//////

///capurl转换器,网址后以controller为第一路径,action为第二路径,后面紧随执行参数,?后跟随是页面参数
///例如:http://127.0.0.1/page/news/3232332.html?from=www.baidu.com
///其中http://127.0.0.1为域名区域,page为controller名称,news为action名称,3232332为新闻序号参数,?后面跟得是页面参数。//////这是各种路由转换器的一种,其基础类是siteroutebaseusingsystem.web.routing;namespacevonportal.web{//////capurl转换器,网址后以controller为第一路径,action为第二路径,后面紧随执行参数,?后跟随是页面参数
///result.values["controller"]=controller名称,如果没有则是home
///result.values["action"]=action名称,如果没有则是index
///result.values["item"]=执行参数,以string[]对象存储,没有则为string[0]
///result.values["param"]=页面参数,以string[]对象存储,没有则为string[0]
///result.values["controller"]=controller名称///
///http://127.0.0.1/news/view/221122.html?from=wwww.sina.com.cn//////publicclasscaprouter:siteroutebase{//////解析一个url///>///路由数据///不含网站头的访问路径///路由数据publicoverrideboolgetroutedata(routedatadata,stringaccessurl){//[{controller}]/{action}[/{key}/{key_value}..]?{param_name}={param_value}[&{param_name}={param_value}..]accessurl=accessurl.trim(newchar[]{'/','','?','&'});intmpos=accessurl.indexof('?');string[]path=mpos>=0?accessurl.remove(mpos).split(newchar[1]{'/'}):accessurl.split(newchar[1]{'/'});string[]param=mpos>=0?accessurl.substring(mpos+1).split(newchar[2]{'&','='}):null;//writeparameterstoroutedatas.[{controller}]/{action}[/{key}/{key_value}..]intidx=0;if(path.length>0&&path.length%2==0&&path[0]!=""){data.values.add("controller",path[idx]);idx++;}elsedata.values.add("controller","home");if(path.length>0&&path.length%2==1&&path[0]!=""){data.values.add("action",path[0]);idx++;}elseif(path.length>1&&path.length%2==0&&path[1]!=""){data.values.add("action",path[1]);idx++;}elsedata.values.add("action","index");stringkey="";while(idx///得到一个可访问的虚拟路径///
///系统路由///访问内容///执行参数///可访问的虚拟路径publicoverridevirtualpathdatagetvirtualpath(vonportalrouteroute,requestcontextrequestcontext,routevaluedictionaryvalues){varelegantvalues=newroutevaluedictionary(values);route.url="{controller}/{action}";foreach(keyvaluepairkvinvalues){if(kv.key=="site")continue;if(kv.key=="area")continue;if(kv.key=="controller")continue;if(kv.key=="action")continue;if(route.url.indexof("{"+kv.key+"}")>0)continue;route.url+="/"+kv.key+"/{"+kv.key+"}";}virtualpathdatadata=route.basevirtualpath(requestcontext,elegantvalues);returndata;}}}

上一篇: CAS支持http协议
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服