上一节小编说到DTcms频道类别名称形同虚设问题,那今天接着来看看这个问题怎么如果更进一步的完善呢,看下图,是小编新增加的可以提前做出判断是用调用名还是内容ID,做的比较简单,高手可以进一步完善一下。
注意:本教程不适用于生成静态,如果您的网站是静态默认运行,请绕过本文章,否则会造成网站生成静态时出错;如果您是高手,可自行修复,修复方法也比较简单,由于小编时间关系,后期会慢慢通过教程来完善DT的生成静态方式;以及以静态缓存模式运行网站,这个是DT没有的,因为工程有点长,所以等后期小编有足够的时候在来说这个问题;
我们来看一下具体实现步骤:
1、为了让后台更加方便,所以我们先添加一个“调用名”选择顶
在DTcms.Web\admin\dialog\dialog_rewrite.aspx, 第107行
<option value="call_index">调用名</option>
2、修改模版继承类,article_show.cs,将变量page修改为call_index;(这一步可修改可不修改,小统只是为了方便统一使用,因为类别名使用的是call_index,这里使用page,有时候会造成混淆;),具体代码如下
文件:DTcms.Web.UI\Page\article_show.cs
protected int id; protected string call_index = string.Empty; protected Model.article model = new Model.article(); /// <summary> /// 重写虚方法,此方法将在Init事件前执行 /// </summary> protected override void ShowPage() { id = DTRequest.GetQueryInt("id"); call_index = DTRequest.GetQueryString("call_index"); BLL.article bll = new BLL.article(); if (id > 0) //如果ID获取到,将使用ID { if (!bll.Exists(id)) { HttpContext.Current.Response.Redirect(linkurl("error", "?msg=" + Utils.UrlEncode("出错啦,您要浏览的页面不存在或已删除!"))); return; } model = bll.GetModel(id); } else if (!string.IsNullOrEmpty(call_index)) //否则检查设置的别名 { if (!bll.Exists(call_index)) { HttpContext.Current.Response.Redirect(linkurl("error", "?msg=" + Utils.UrlEncode("出错啦,您要浏览的页面不存在或已删除!"))); return; } model = bll.GetModel(call_index); //赋值文章ID id = model.id; } else { HttpContext.Current.Response.Redirect(linkurl("error", "?msg=" + Utils.UrlEncode("出错啦,您要浏览的页面不存在或已删除!"))); return; } //跳转URL if (model.link_url != null) { model.link_url = model.link_url.Trim(); } if (!string.IsNullOrEmpty(model.link_url)) { HttpContext.Current.Response.Redirect(model.link_url); } //判断SEO标题 if (string.IsNullOrEmpty(model.seo_title) || "" == model.seo_title) { model.seo_title = model.title; } }
3、新增地址解析方法queryurl(),这个方法的作用就是在前台模版中用于自动判断调用名称是否有值,有值就优先使用调用名做为解析地址,具体代码如下:
文件:DTcms.Web.UI\BasePage.cs
/// <summary> /// 返回URL重写统一链接地址 /// </summary> /// <param name="_key">URL调用名称</param> /// <param name="_call_index">内容调用名称</param> /// <param name="_id">文章ID</param> /// <returns></returns> public string queryurl(string _key, string _call_index, int _id) { if (string.IsNullOrEmpty(_call_index)) { return linkurl(_key, _id); } return linkurl(_key, _call_index); } /// <summary> /// 返回URL重写统一链接地址 /// </summary> /// <param name="_key">URL调用名称</param> /// <param name="_call_index">内容调用名称</param> /// <param name="_id">文章ID</param> /// <returns></returns> public string queryurl(string _key, string _call_index, string _id) { if (string.IsNullOrEmpty(_call_index) || "" == _call_index) { return linkurl(_key, _id); } return linkurl(_key, _call_index); } /// <summary> /// 返回URL重写统一链接地址 /// </summary> /// <param name="_key">URL调用名称</param> /// <param name="_url">链接地址</param> /// <param name="_call_index">内容调用名称</param> /// <param name="_id">文章ID</param> /// <returns></returns> public string queryurl(string _key, string _url, string _call_index, string _id) { if (!string.IsNullOrEmpty(_url)) { return _url; } else if (string.IsNullOrEmpty(_call_index) || "" == _call_index) { return linkurl(_key, _id); } return linkurl(_key, _call_index); }
4、为了让前台能支持queryurl()方法,我们还得去修改一下模版引擎;
首先将表达式数组由23改成24;
public static Regex[] r = new Regex[24];
赋值正则表达式
//URL链接标签 r[23] = new Regex(@"(<%queryurl\(([^\s]*?)\)%>)", options);
在ConvertTags()方法中添加解析方法
#region 解析url链接标签(2)============================================OK foreach (Match m in r[23].Matches(strTemplate)) { IsCodeLine = true; strTemplate = strTemplate.Replace(m.Groups[0].ToString(), string.Format("\r\n\ttemplateBuilder.Append(queryurl({0}));", m.Groups[2]).Replace("\\\"", "\"")); } #endregion
到这一步,我们的源码优化已经大功告成了,现在要做的就是在前台模板文件中使用queryurl()方法来解析地址;如下图
在最后小编在给大家提点小建议,如果当ID和调用名同时使用时,需要将ID值放在前面,不然会出错,正确配置方法如下图: