自定义页面如何快速获取url参数值

之前章节已经介绍了,如何创建自定义页面,这章通过一个实例讲解模板中如何获取url中的关键参数。

项目要求:当用户输入http://www.domain.cn/news/tag-1/这个地址时候,可以打开所有标签id为1的新闻页面。

根据这个地址,我们先写一个url的正则表达式,如下

^news/tag-([1-9]\d{0,8})/?$

([1-9]\d{0,8})这个部分表示标签的id,我们需要在模板中获取tag-1中的数字部分,那么模板中如何获取呢?


方法1

通过Html.PagePath先获取到页面的路径,代码如下:

    string urlPath = Html.PagePath(); //获取当前页面地址:news/tag-1/,不包含域名前缀
    string[] arrayPath = urlPath.Split('/'); //分割成数组
    string tagStr = arrayPath[1]; //获取数值中下标为1的部分,即:tag-1
    string tagIdStr = tagStr.Replace("tag-","");//过滤掉tag-部分,得到后面的数字部分
    int tagId = StringHelper.Format<int>(tagIdStr);//最后再把字符串转为数字。

为了获取url的中关键参数,模板中采用了分割,替换的方式获取最终数据,显然这种方式效率很低,下面说第二种方法,在4.0.09版本后新增的方法。


方法2

给正则添加分组名称,直接通过名称获取。

基础知识科普:正则的分组规则:  (?<name>xxx)  ,下面改造一下上面的url正则,如下:

^news/tag-(?<tagId>[1-9]\d{0,8})/?$

模板中的获取方式如下:

    string tagIdStr = Html.CustomViewParameter("tagId");//Html.CustomViewParameter为4.0.09新增的扩展方法
    int tagId = StringHelper.Format<int>(tagIdStr);//最后再把字符串转为数字。

从上面代码可以看出到,Html.CustomViewParameter节约了很多代码量,大大提升了模板的制作效率


注:由于pageadmin的正则是写到配置文件中,所以正则中的<符号必须转义成&lt; >符号转义成&gt;

完整的配置如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <route urlConstraint="^news/tag-(?&lt;tagId&gt;[1-9]\d{0,8})/?$"  viewPath="新闻中心/tag.cshtml" httpcacheSolutionId="0" title="新闻标签"></route>
</configuration>