使用拼凑URL的方法,实现DotNetNuke在新窗口中打开内容(三)
在前面的文章中,我们介绍了如何通过一系列的“擦边球”,使得DotNetNuke可以更加符合我们国人的网页浏览习惯,而这些修改,是不能动到DotNetNuke的核心的,我们总共所做的修改如下:
1、在根目录下增加一个新的Edit.aspx,并且修改其代码,使之所加载的皮肤与Default.aspx页面不同;
2、在Portals/_default/Skins/[当前使用的皮肤目录]下增加一个皮肤,这个皮肤是最简单的,只包括DotNetNuke的几个Pane而已,不包括其他任何的内容;
3、我们需要修改SiteUrls.config文件,从而要使得DotNetNuke能够“认识”我们的Edit.aspx文件;
主要的修改,就是这么多,具体的效果,大家可以点击这个地址看一下效果,当然,也可以进入到这个网站,进入到其中的Demos下各个页面中,查看一下效果。
为了让大家更加清楚的了解我们所做的工作的意义,下面以问答的形式,让大家更清楚的知道我们的工作是有必要的、而不是无用功。
问:为什么非要在根目录级别下增加页面文件?难道在模块目录下增加aspx文件,在新窗中打开我的aspx文件不一样是可以的吗?
答:当然,我们可以在 模块目录下增加aspx文件,而不是通常我们在模块开发中所使用的ascx控件;也可以使用如/DesktopModules/Module1 /openhere.aspx这样的URL形式来实现在新窗口中打开页面,这个页面就完全是由我们进行控制的了。但是,有一个问题,就是如果我们在模块级 别增加的是一个aspx文件的话,这个页面实际上并不是我们的模块的控制(Control)之一,也就是说,很多属于模块的属性,比如ModuleID、 TabID等等变量,我们可能都需要通过URL参数或者其他的方式传到这个页面上去。如果我们这样做的话,实际上,这个aspx页面已经完全脱离了我们模 块的设计架构,从而变得更加“另类”了。只有极少数的情况下,我们才这么做:比如说,我们所打开的数据并不是和模块绑定的(比如说公共数据,如另外一个网 站的数据等)。而如果我们所打开的新页面是用来显示模块级的数据的话,大家就会发现,一定会非常麻烦,比我们现在所使用的方式更加麻烦。
大家可以看到,上面所采用的增加Edit.aspx的方式,实际上是在更底层解决这个问题,而不是模块级别,所以,我们的解决办法,不会影响到模块级的数据。
以上的解释可能有点混乱,但是我相信曾经尝试过在模块级增加aspx文件的可以了解这一点。
问:如http://www.dnnworkflow.cn/tabid/55/ctl/Edit/mid/374/KeyID/5/RowID/22/Edit.aspx?ContainerSrc=[G]Containers/_default/No%20Container这样的URL中,Default.aspx后面仍然跟了参数,也就是?ContainerSrc=[G]Containers/_default/No%20Container,这个参数有什么意义?
答:我们知道,DotNetNuke的皮肤机制是 包括两部分的,一个是Skin,一个是Container,分别对应于站点的皮肤,和容器的皮肤——就是指我们所用到的一个个模块的皮肤了。我们现在在新 窗口中打开页面,实际上就是将一个模块的一部分(也就是一个控制 Control)在新窗口中予以展现,如果没有以上参数的话,大家可以看到,显示的内容,是被容器的皮肤所包围的。当然,如果大家觉得没有所谓的话,大可 以将这个参数去掉。我之所以增加这个参数,是考虑到如果使用window.print命令的时候,可以有更好的页面打印效果。
问:DotNetNuke实际上已经 提供了无皮肤、无容器的方式,也就是当点击每一个模块下面的“打印”按钮的时候所出现的页面,其地址可能 是:http://www.dnnworkflow.cn/Demos/申请流程/tabid/55/mid/374/dnnprintmode /true/Default.aspx?SkinSrc=[G]Skins/_default/No+Skin&ContainerSrc= [G]Containers/_default/No+Container,注意其中Default.aspx后面的参数,已经指定了当前的页面不引用皮 肤、不引用容器,为什么我们还要如此麻烦的增加Edit.aspx并且做如此多的设置呢?
答:这个问题问的不错。实际上,确实 是,当我们在Default.aspx后面增加上述的参数的时候,DotNetNuke自动将所有的皮肤、容器全部都去掉了。假设我们开发一个模块,这个 模块的一个link是在新窗口中打开当前模块的另外一个控制的话,那么,是的,得到的效果非常近似于我们前面所做的内容:没有皮肤、没有容器,只有内容 (这个大家可以自行试验一下)。但是,有一个问题我相信大家也会注意到,就是,使用这种方式的时候,我们页面上所设置的所有的CSS都无效了!如果我们需 要单独为我们的页面定义CSS的话,那样就不太好了,也就是说,我们的模块脱离了系统的皮肤,这样实际上并不好。当然,我们似乎可以通过修改No Skin.ascx文件,使之增加CSS的解析;但是我们又考虑到,Google等搜索引擎比较不喜欢带有?参数的页面,所以,这样的参数,最好是尽量的少;最好是没有。
答:我们知道,DotNetNuke的皮肤机制是 包括两部分的,一个是Skin,一个是Container,分别对应于站点的皮肤,和容器的皮肤——就是指我们所用到的一个个模块的皮肤了。我们现在在新 窗口中打开页面,实际上就是将一个模块的一部分(也就是一个控制 Control)在新窗口中予以展现,如果没有以上参数的话,大家可以看到,显示的内容,是被容器的皮肤所包围的。当然,如果大家觉得没有所谓的话,大可 以将这个参数去掉。我之所以增加这个参数,是考虑到如果使用window.print命令的时候,可以有更好的页面打印效果。
问:DotNetNuke实际上已经 提供了无皮肤、无容器的方式,也就是当点击每一个模块下面的“打印”按钮的时候所出现的页面,其地址可能 是:http://www.dnnworkflow.cn/Demos/申请流程/tabid/55/mid/374/dnnprintmode /true/Default.aspx?SkinSrc=[G]Skins/_default/No+Skin&ContainerSrc= [G]Containers/_default/No+Container,注意其中Default.aspx后面的参数,已经指定了当前的页面不引用皮 肤、不引用容器,为什么我们还要如此麻烦的增加Edit.aspx并且做如此多的设置呢?
答:这个问题问的不错。实际上,确实 是,当我们在Default.aspx后面增加上述的参数的时候,DotNetNuke自动将所有的皮肤、容器全部都去掉了。假设我们开发一个模块,这个 模块的一个link是在新窗口中打开当前模块的另外一个控制的话,那么,是的,得到的效果非常近似于我们前面所做的内容:没有皮肤、没有容器,只有内容 (这个大家可以自行试验一下)。但是,有一个问题我相信大家也会注意到,就是,使用这种方式的时候,我们页面上所设置的所有的CSS都无效了!如果我们需 要单独为我们的页面定义CSS的话,那样就不太好了,也就是说,我们的模块脱离了系统的皮肤,这样实际上并不好。当然,我们似乎可以通过修改No Skin.ascx文件,使之增加CSS的解析;但是我们又考虑到,Google等搜索引擎比较不喜欢带有?参数的页面,所以,这样的参数,最好是尽量的少;最好是没有。