首页 / 网页编程 / ASP.NET / 使用拼凑URL的方法,实现DotNetNuke在新窗口中打开内容(一)
使用拼凑URL的方法,实现DotNetNuke在新窗口中打开内容(一)2010-06-18 cnblogs dnnworkflow『注:这是比较早期一点,使用Google Docs整理自己的思路的时候写的文章,为了将整个思考的过程体现出来,贴在博客园上;由于内容比较多一些,因此,拆分成两个部分。』DotNetNuke在新窗口中打开编辑内容这个问题困惑了很久,现在既然已经解决了,干脆把解决的思路和过程写下来。从本质上来说,运行中的DotNetNuke只有一个页面:就是Default.aspx这个文件(当然,在安装的时候有Install.aspx文件以及其他几个有限的配置文件),其他的文件全部都是ascx文件——也就是.Net的“用户控件”,这有一个好处就是所有的入口统统都是这个 Default.aspx文件,比如像皮肤之类的,就好处理多了。ascx文件是通过模块配置的功能来配置的。DotNetNuke采用这种方式,使得整个系统的编程就是编写一些用户控件而已,不需要改动整个系统的架构,所有模块级的错误都在模块中体现,不会影响到整个系统,这是非常好的一种结构。但是我在使用DotNetNuke做开发的时候,遇到的一个很大的问题也正是这种结构引起的:由于整个系统只有一个Default.aspx文件,所以当用户在操作的时候,只操作这一个文件,这造成的后果就是所有的内容都是在一个窗口中打开的!比如说,如果我用DotNetNuke做新闻发布平台的话,用户能做的就是点击新闻,在同一个页面打开,然后点返回,到下一条新闻再打开。这种方式对于美国人来说是非常正常的,比如我们看CNN或者NBA或者其他的国外网站,基本上新闻都是在当前的页面打开的,而不会在新的窗口中打开;而如果我们看一下新浪、搜狐、雅虎中国等网站的话,我们就会发现,基本上新闻内容都是在新窗口中打开的,一般来说,中国人看新闻都会有若干个浏览器窗口同时打开,然后一个页面一个页面的看完之后再关闭掉。为什么东西方会有这样的差异呢?我以为最开始可能是由于网络速度引起的,一开始的时候由于网络的带宽不够,所以在国内看网页的速度是非常慢的;而美国由于身处互联网的腹地,所以可能网络的浏览速度会更快一些,所以就造成了国人一般都是同时打开若干个窗口,在看当前窗口的新闻的时候,其他的新闻在后台加载,这样是最节约时间的;而在美国则不存在这个问题。好了,说了这个问题之后,就引出了我的问题了:DotNetNuke的所有内容都是在一个窗口中打开的,这完全不符合中国人的阅读习惯。尤其是在五月底见了一个客户之后,感觉就更明显了,所以,要么改变这种情况,要么就抛弃DotNetNuke,这是我一直以来非常痛苦的地方——基于DotNetNuke 编程已经两年多了,结果因为这个问题没办法进行下去,实在是太痛苦了。当然,并不是说DNN完全不支持多窗口的模式,内容还是可以在新窗口中打开的,比如像EditUrl直接Redirect到新窗口,还是可以的;但是这样最大的问题就是新的窗口里面包含了系统菜单、隐私说明、Banner等全部的内容,而不是仅仅只有我希望显示的模块的内容。这么做其实是等于把同一个系统在多个窗口里面打开了,而不是一个系统的一部分(也就是只有内容部分,不包括系统菜单等系统的部分)。关于这个问题,曾经想了这么几个解决方案:自 己重新写一个aspx页面,用这个页面动态的加载DotNetNuke模块的ascx文件:这样当然也不是不行,但是问题是如果自己写一个页面的话,很多 DNN内置的变量,如UserID、ModuleID、Settings等等这些设置就完全没办法带到新的页面里面了,必须要通过URL来传递这些参数; 而且,这么做最大的问题就是已经完全破坏了DNN的整体架构的完整性,会搞得乱七八糟,这是最坏的一种做法;建立一个自己的系统,和DNN进行数据交互:这是个比较疯狂的想法,我希望我的aspx驱动的系统和DNN可以共享数据,从而读取DNN的数据结构,这是在上次和用户交流过了之后,实在是没有办法的时候想的一个想法,目前这个想法已经被否定了;换 平台,不用DNN:这也是一个比较疯狂的想法,如果换平台的话,之前在这个系统上做的所有的努力都将白费了,这实在是我不希望看到的。说一下,因为DNN 的有些开发人员同时在Rainbow项目组工作,所以我专门去下载了一个Rainbow的平台下来,发现和DNN不同,Rainbow是aspx页面驱动 的,而不是ascx驱动的,这就意味着如果我抛弃DNN的话,完全可以选择Rainbow平台,不过比较郁闷的是,现在Rainbow所提供的开发版本还 是过低,而且只支持VS2003和.Net1.1,我很怀疑这个平台的活跃性。就是说,如果我选择了一个没有那么多人提供模块的平台的话——也就放弃了选 择CMS作为我的系统架构的最大的优点:尽可能的使用开源的模块完成更多的功能,自己只需要专注于某一块业务,而不用管整个系统的架构和扩展性的部分;复制一个新的Default.aspx文件,改写这个文件,使之只包含模块编辑的内容;现在想起来,还是感谢Rainbow没有提供.Net 2.0和VS2005的版本,否则的话,可能我会轻易的放弃DNN,如果那样的话,我的工作量实在是太大了。好,现在已经讲到这个地步了,我陷入了一个怪圈:我比较喜欢DNN的开发结构和开放性,这是让我感觉非常舒服的;但是我不喜欢的、也是大多数中国人都不太喜欢的,就是所有的功能都是在一个单独的Default.aspx页面里面进行操作;老实说,我非常不喜欢,而且是要多不喜欢就有多不喜欢。那,现在怎么办?到底要不要放弃DNN?这对我来说真的是一个大问题了。为了实现在新窗口里面打开DNN的模块,我在网上发布了大量的求助信息,尤其是在www.DotNetNuke.com的论坛上(现在在上DNN的时候发现4.8.3版本已经发布了,我现在使用的是最新的4.8.2,看来还需要升级)。而在Google里面,我用“DotNetNuke newwindow”、“DotNetNuke aspx”、“DotNetNuke open in New Windows”等字符串不停的搜索和找相关的资料,可惜的是,这方面的内容实在是太少了。简单的来说,老外是不太理解为什么我们一定要在新窗口中打开内容的。对我来说,我觉得这是一个必须要解决的问题,如果不解决这个问题的话,恐怕我总是不会安心,而且,最重要的是,客户不会满意;而且,使用DNN平台将一直会有问题。我没办法实现我的DNN做更多的事情的想法。