修复DTcms频道详情页报错问题

Hailin 发表于 2016-05-05 01:28:46 来源于CMS插件网 评论 0 点击 1038
摘要:dtcms频道详情页,当接收的ID值大于整型int的取值范围时,就会报错,正常使用情况下基本没问题;喜欢较真的小编还是要教大家怎么来修复这一问题,方法很简单。

再三申明,本问题属于小编的看法,小编喜欢折腾,也喜欢较真,本文章不属于Bug,所以不针对DT官方,不影响使用。小编发现本问题也是一种巧合,小编在DTcms里面加入了log4net日志登记,小编的网站还没有正式公开,每天都有几条报错,经过小编翻看日志发现,这个错误就来自这个页面,当接收的ID值大于整型int的取值范围时,就会报错,如下图:

8.jpg

通过错误信息,很显然取值范围已经超过了Int32的最大范围,如果我们把值在设置大一点,把2147473648改成21474836481,在看看会有什么结果呢。

10.jpg

神奇般的又正常了,这是为什么呢,我们先把问题放到后面在讲,我们在来动动手;标准的新闻页面还有发表作者、新闻来源。那我们加上去试试,这里我们用V4.0.3版本来做测试,因为要添加作者和来源,所以我们换成本地来测试;

<span>来源:{model.fields[source]}</span>
<span>编辑:{model.fields[author]}</span>

11.jpg

错误信息又来了,这次报的和之前两个都不一样,“未将对象引用设置到对象的实例”,这是为什么呢,我们来看看文件的继承类文件"article_show.cs";

12.jpg

我们可以看到第45行处,直接就一条return语句,并没有跳出页面,当id>0和page不为空都不满足的情况下,才会执行到这里,那在什么情页下才会不满足呢。

情况就出在这里,因为DTcms采用了地址重些,重写的时候使用的是正则匹配,而只要是数值不管多少位都会匹配为id=数值的这种情况,而page自然就会为空,id在进行StrToInt()方法进行转换的时候因超出范围而默认为0,所以前两都都不满足,就会执行到return;,这样Model.article model就处于未初始化值状态;而model.fields、model.albums、model.attach都会因为未初始化而报错,修复方法很简单,return前面添加一条跳出到错误页面的语句就可,如下图:

13.jpg

HttpContext.Current.Response.Redirect(linkurl("error", "?msg=" + Utils.UrlEncode("出错啦,您要浏览的页面不存在或已删除!")));

到此我们的修复工作就做完了,是不是很简单。

热门资讯