Register  |   Login
关于本人
Baldwin's Status
Ramblings of a developer for dnn solution...
 Contact Me
随笔档案
Blog搜索
相册库
更多照片请查看相册库
最新评论
Rss Feed
feedsky
抓虾
pageflakes
newsgator
哪吒
我们的服务
  • DotNetNuke 咨询
  • Web设计及其模块开发
  • 免费建站
  • 电子商务
  • 开拓市场
我们致力于开发定制的web 2.0 ,所服务的客户主要包括小中型企业,社区俱乐部及其非盈利机构组织。我们将利用开源的DNN作为我们核心的系统机制,更多相关信息...

解析DNN皮肤级别的doctype声明

Posted in [DNN使用及思考], [DNN核心代码], [DNN皮肤设计], [优化DNN] By baldwin

自从DNN 4.4版本开始, DNN主要的重心转移到性能和优化方面,由此引入了一系列的优化措施和功能的改进, 如今的DNN已是今非昔比。而在跟Web标准的靠拢方面,DNN也做出了一定的努力,比如下边即将提到doctype的概念, 在详细说明DNN中doctype的用途及其优势之前,先简单介绍doctype这个概念。
DOCTYPE是document  type(文档类型)的简写,声明位于文档中的最前面的位置,处于标签之前。此标签可告知浏览器文档使用哪种HTML或XHTML规范。一般doctype的定义格式类似以下:
DOCTYPE的定义格式
<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference"  [declarations] >
关于这些参数的作用,你不妨去MSDN查查,这里就简单举一个例子来说明DTD的含义:
简单示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
其中的DTD(document type definition)叫文档类型定义, 例如上例中的xhtml1-transitional.dtd,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来。要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分.
注意: 标签没有结束标签.
目前主要被运用的doctype声明有HTML和XHTML两种标准,这里主要介绍一下XHTML, XHTML是接替HTML的下一代网页标记语言(http://www.w3.org/MarkUp/)。如果你的网站按照较严格的XHTML规则书写,那么这个网站将在不同的浏览器中保持一致的样式。并且你可以认为在未来浏览器的版本升级变化中仍然保证网站外观的一致性。同样你也会得到跨浏览器,跨设备以及跨平台的一致性支持。)
XHTML有如下两个主要目标:
  • 将文档的结构(使用XHTML标记语言)和表现(使用CSS)分开
  • 将HTML作为一种XML书写
XHTML 1.0规定了三种XML文档类型:Strict、Transitional以及Frameset。
XHTML Strict DTD
Strict DTD要求非常严格,需要纯粹的XHTML标记,不能使用任何表现层的标识和属性,如此一来可避免表现层和数据的混乱,在使用这种类型声明时最好请与CSS配合使用:
XHTML Strict DTD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTML Transitional DTD
Transitional DTD要求比较宽松,可包含W3C所期望移入样式表的呈现属性和元素,也就是说允许你继续使用HTML4.01的标识(但是要符合xhtml的写法)。
XHTML Transitional DTD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
XHTML Frameset DTD
专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD,除此之外,它等同于Transitional DTD.
XHTML Frameset DTD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
补充说明一下:如果需要检查你是否编写了带有正确DTD的合法XHTML文档,您可以把您的XHTML页面链接到一个XHTML验证器。
目前我们一般为了兼顾html的格式问题,主流的doctype是过渡的DTD(XHTML 1.0 Transitional),因为这种DTD还允许我们使用表现层的标识、元素和属性,也比较容易通过W3C的代码校验。何谓"表现层的标识、元素和属性"呢?它是指那些纯粹用来控制表现的tag,例如用于排版的表格、背景颜色标识、
等等。在XHTML中标识是用来表示结构的,而不是用来实现表现形式,最终理想的状态就是实现结构和表现相分离。
DNN目前是在skin级别上定义doctype的,在没有引入这个概念之前,DNN是默认采用兼容于Html 4.0.1以下版本的定义格式,在default.aspx.cs可找到DNN的添加doctype的机制:
skin级别上定义doctype
 ''' <summary>
       ''' 寻找皮肤级别的doctype配置文件并插入到default.aspx文件的最顶端,如果没找
''' 到配置文件,则将应用默认的doctype声明
 ''' </summary>
 ''' <param name="SkinPath">正在运用的DNN皮肤路径</param>
Private Sub SetSkinDoctype(ByVal SkinPath As String)
       Dim FileName As String = ApplicationMapPath & SkinPath.Replace(".ascx", ".doctype.xml")
            '设置默认的doctype
       Dim DoctypeValue As String = "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">"
 
       If File.Exists(FileName) Then
           Try
                Dim SkinDoctype As New System.Xml.XmlDocument
                SkinDoctype.Load(FileName)
                DoctypeValue = SkinDoctype.FirstChild.InnerText.ToString
           Catch ex As Exception
            '如果发生异常则启用默认的doctype声明                
DoctypeValue = "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">"
           End Try
        End If
        'Find the placeholder control and render the doctype
        Dim objDoctype As Control = Me.FindControl("skinDocType")
        CType(objDoctype, System.Web.UI.WebControls.Literal).Text = DoctypeValue
 
 End Sub
分析代码可知, DNN在4.4版本之后是引入了在skin级别定义doctype配置文件的机制来实现doctype动态添加的.比如皮肤文件为dnnsun.ascx,则对应的doctype配置文件应该是dnnsun.doctype.xml,而在里边定义doctype的方式是:
定义doctype
<SkinDocType><![CDATA[doctype declarations]]></SkinDocType>
比如:
XHTML  1.0
<SkinDocType><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">]]></SkinDocType>
这时你在浏览器中打开页面并查看页面源代码,你会注意到这样的声明,这就是在皮肤doctype配置文件的作用:
在此为了以后的兼容性及其规范化的考虑, 我建议皮肤都应该增加这一配置文件,特别是你如果在模块或页面中使用ASP.NET Ajax 的话,那这一限制这是必须的,否则你可能会出现各种各样莫名的问题,比如TabContainer控件的图片分离, ModalPopup控件的不可见等等问.总之如果你在开发Ajax的模块过程中出现问题且你并没有添加这一配置文件的话,那不妨先考虑这种可能性吧.
究其原因,就是ASP.NET Ajax是在遵循XHTML 1.0的标准的,也就是不管在CSS样式方面,还是javascript方面都会有所体现的,而XHTML 1.0的规范和HTML的规范有差异的,从而导致某些属性的取值会有所差别,比如说document.body.clientWidth一般是指浏览器可用区域的高度,可如果在XHTML 1.0解析的页面是不起作用的,这时你得用document.documentElement.clientHeight这一属性.关于这方面对CSS和JS的影响你可以到查到更多资料,在此我就不累赘了. :)
但是有人会提出疑问,如果我们页面都是应用不同的skin的话,那每次加载页面,DNN都是寻找这一配置文件并对此加以作XML格式验证,从而会造成一定的开销并影响性能,这也许就是我一直强调的所谓”DNN代价”, skin就是一个典型的例子,更多类似的例子可在我前边的文章找到 -- 对DNN在国内的影响及其弊端的思考. 为了兼顾功能和性能的两全之策,我这提出了一个解决方法,你如果需要的话,不妨试试:
合理添加doctype的解决方案
<script runat="server">
        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
           Dim skinDocType as Control = Me.Page.FindControl("skinDocType")
           If Not skinDocType is Nothing
              CType(skinDocType, System.Web.UI.WebControls.Literal).Text="<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Strict//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"">"
           End If
        End Sub
</script>
本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利

Comments

Was it good for you, too?Join the discussion » ,but you need to login first before you make comments.