DNN永远都是运行在网站的根目录
DNN的设计上最大的特点就是始终是使用一个网站根目录下的Default.aspx文件加载皮肤和模块从而实现整个网站的页面。这也就是说DNN这个Asp.net程序永远是运行在DNN网站的根目录的,所有的资源文件(如:JS文件,图片,CSS)的引用都要从DNN网站的根目录算起。
这么说有点难以理解,举个例子吧:
假设你把DNN安装到了一个虚拟目录下面,比如DotNetNuke_2目录下,那么你输入http://localhost/DotNetNuke_2就可以访问到这个DNN网站了。
然后你新建了一个模块,放到了DNN网站的DesktopModules/MyModuleName目录下。现在你新建模块在IIS中位置应该是这样的:http://localhost/DotNetNuke_2/DesktopModules/MyModuleName
问题来了
现在你需要在View.ascx文件中放入一个图片,作为界面的一部分,这个图片的名字是”CompanyLogo.gif”,位置就在”MyModuleName”这个目录下,自然,我们可以放入一个img tag,如下:
现在问题来了,这个src到底是多少呢?
是使用”./CompanyLogo.gif”?我们先来试试,代码如下:
最后生成的html代码跟这一样:
并且图片没有显示,仔细一想,对啊,DNN是一直在根目录运行,模块只是作为一个控件加载,DNN的根目录下自然没有CompanyLogo.gif这个文件。
这样不行就使用全名指定吧,这总没问题了吧。我们来试试:
运行后,图片显示了,这样可以!
不过等等,如果别人用这个模块,虚拟目录可能就不是这个名字了,这个怎么处理?
ModulePath
这样的话,目录的路径就应该动态生成了,DNN已经为我们考虑了这个问题,在PortalModuleBase基类里,有一个ModulePath属性,使用这个属性就可以动态生成资源对应的路径了。
最后的代码如下:
就可以了。
在这里ModulePath 的值为 "/DotNetNuke_2/DesktopModules/ MyModuleName /"
ResolveUrl
还有一个函数可以了解一下,就是在DotNetNuke.Common.Global类中的ResoveUrl函数
如果传入的URL以”~”开头,就会使用ApplicationPath代替”~”。
就是说我们可以用”~”来指代DNN的网站根目录,这样对于任何资源,我们只要使用”~”来开头,从根目录开始制定,就都可以引用到。
在这个例子里,可以这么写:
这里
ApplicationPath的值为"/DotNetNuke_2"
最后
希望这些小技巧能帮你解决一些问题!