Community Server系列之三:页面间关系2[介绍]

       CS中几乎所有的页面都是靠模板的呈现方式来实现的,那么CS中有些什么样的模板呢,让我们看看CS中的模板机制吧:

       在我们使用IDE打开Default.aspx页面时,我们仅仅看到一些毫无顺序的控件,几乎看不到控制布局的Html标签,不要困惑,因为在CS中UI层也是按照模板思想分层实现的。先来看看几个类的实现:

打开\src\Controls\ContentContainer.cs

这个文件里分别实现了

public class MPContainer : MetaBuilders.WebControls.MasterPages.ContentContainer{…}

public class MPRegion : MetaBuilders.WebControls.MasterPages.Region{}

public class MPContent : MetaBuilders.WebControls.MasterPages.Content{}

public class MPForm : MetaBuilders.WebControls.MasterPages.NoBugForm {}

public class MPScript : System.Web.UI.WebControls.PlaceHolder {}

这些类前四个都继承自MetaBuilders.WebControls.MasterPages,那么为什么CS不直接使用这些控件呢,因为这是第三方控件,主动权不在CS中,CS为了隔离控件变动使用了代理模式,这样就可以在程序里使用统一的方法,不用担心以后第三方控件的变动了,同样,在CS系统里还大量运用了此模式,比如在使用FreeTextBox的时候不是直接使用,而是通过Telligent.FreeTextBoxWraper这个类进行封装隔离,并且同时继承自ITextEditor接口,这样程序里面在需要用到文本编辑器的时候只需要引入此接口根据配置加载文本编辑器包装类就可以了,这样处理之后撤卸和安装新扩展都会很容易,如果对此模式还不甚了解的话,我会在后面章节介绍这里的原理。

    好了,了解了这么几个控件类之后就看我们怎样在程序里面使用了,首先简单介绍一下这几个控件类的作用吧:

MPRegion:向页面进行注册的控件,这有点类似于那些大型的新闻静态页面发布系统的标识符,生成静态页面的时候根据标识符替换相应的动态数据。

MPForm :作用很简单,就是为客户端生成Form标签。

MPContainer :包容MPContent控件的容器控件。

MPContent:此控件的ID只要和在Master页面设置的MPRegion控件的ID一致,那么此控件中的内容便自动嵌入到MPRegion控件的位置了,此控件必须用在MPContainer之内。

简单介绍了这些控件之后如果你是初次接触CS那么肯定还会很迷糊,别急,让我们先了解在CS中模板的“继承”关系,虽然不是严格的继承但我们可以这样理解,让我们打开具体的风格文件夹在这里我们看看在\src\Web\Themes\default\文件夹下的Masters文件夹,此文件夹下大部分都是以Master命名的ascx文件不难从名字可以看出,最主要的文件当然是Master.ascx了,这是所有页面都需要引用的主模板,根据继承的概念我们应该清楚在此文件里应该放一些每个页面都需要用到的Html标签等等,比如页头,公用样式,页面的布局页角以及Form标签等等,如下面的代码:

Master.ascx
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    
    <CS:MPRegion id="HeaderRegion" runat="server" >
    
    <CS:Head runat="Server">
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <CS:Style id="UserStyle" runat="server" visible = "true" />
        <CS:Style id="s2" runat="server" visible = "true" Href="../style/Common.css" />
        <CS:Style  runat="server" Href="../style/common_print.css" media="print" />
        <CS:Script id="s" runat="server"  />
    </CS:Head>
    
    </CS:MPRegion>
    <body>
        <CS:MPForm runat="server">
            <CS:MPRegion id="bscr" runat="server" />
                <div id="Common">
                    <div id="CommonHeader">
                        <CS:MPRegion id="bhcr" runat="server" >
                            <CS:TitleBar runat="server" id="t" />
                        </CS:MPRegion>
                    </div>

                    <div id="CommonBody">
                        <table cellspacing="0" cellpadding="0" border="0" width="100%" id="CommonBodyTable">
                            <tr>
                                <td valign="top" id="CommonLeftColumn">
                                    <CS:MPRegion id="lcr" runat="server" />
                                </td>
                                
                                <td valign="top" width="100%" id="CommonBodyColumn">
                                    <CS:MPRegion id="bcr" runat="server" />
                                </td>
                                
                                <td valign="top" id="CommonRightColumn">
                                    <CS:MPRegion id="rcr" runat="server" />
                                </td>
                            </tr>
                        </table>
                    </div>
                
                    <div id="CommonFooter">
                        <CS:MPRegion id="BodyFooterRegion" runat="server" >
                            <CS:Footer runat="server" id="Footer1"/>
                        </CS:MPRegion>
                    </div>
                </div>
            </CS:MPRegion>
        </CS:MPForm>
    </body>
</html>

        从代码中我们可以看出MPRegion和MPForm这两个元素,也就是告诉“继承”自这个页面的控件什么地方应该嵌入什么。比如<CS:MPRegion id="HeaderRegion" runat="server" >这个标签表示如果子页面有id为HeaderRegion的MPContent这个控件对象的时候,那么此控件中的内容将插入到此处替换调默认的内容,如果子页面不存在此ID的MPContent的话则使用此标签内的内容。

        其他文件,比如HomeMaster.ascx文件表示首页的模板,此模板的基本模板还是使用Master.ascx这就好比类的继承关系,Master是基类,HomeMaster是首页的基类,default.aspx则是继承自HomeMaster的子类,只是需要在首页的MPContainer标签处标明使用哪一个模板即可,如<CS:MPContainer runat="server" id="Mpcontainer1" ThemeMasterFile = "HomeMaster.ascx" >一个好处就是尽量减少了重复的公用HTML标签,另外一个好处是页面可以分层,比如在设计一个较复杂的首页时,我们可以把大量的复杂的Html标签放在HomeMaster只在需要插入动态内容的地方注册MPRegion标签,这样做后我们只需要在首页里使用MPContent包含相应的动态内容而不需要被复制的Html标签搞昏了头。这就是为什么我们初次打开首页几乎看不到控制首页格式的HTML标签的原因。同理,其他模块也是如此这般,这里就不冗诉了。

posted on 2006-04-24 20:54  dragonpro  阅读(4110)  评论(7编辑  收藏  举报

Free Web Counter