Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns ColdFusion对ASP.NET';什么是母版页?_Design Patterns_Coldfusion_Master Pages_Code Reuse - Fatal编程技术网

Design patterns ColdFusion对ASP.NET';什么是母版页?

Design patterns ColdFusion对ASP.NET';什么是母版页?,design-patterns,coldfusion,master-pages,code-reuse,Design Patterns,Coldfusion,Master Pages,Code Reuse,我正在开发一个用ColdFusion编码的网站。我有一个CSS/HTML模板,我想应用于每个页面的内容,而不需要复制任何多余的代码。我被ASP.NET的母版页给宠坏了,这是我实现这个网站的首选方式。不幸的是,我没有这个选择。该站点必须在Coldfusion MX 7上运行。此外,负责项目的开发人员不喜欢Fusebox,因此该选项已被取消 主导航、图形页眉和页脚在每个页面上都是相同的。标题标签、元标签和二级导航可能因页面而异。除此之外,只有页面的“主要内容区域”会有所不同 考虑到这些参数,如何对站

我正在开发一个用ColdFusion编码的网站。我有一个CSS/HTML模板,我想应用于每个页面的内容,而不需要复制任何多余的代码。我被ASP.NET的母版页给宠坏了,这是我实现这个网站的首选方式。不幸的是,我没有这个选择。该站点必须在Coldfusion MX 7上运行。此外,负责项目的开发人员不喜欢Fusebox,因此该选项已被取消

主导航、图形页眉和页脚在每个页面上都是相同的。标题标签、元标签和二级导航可能因页面而异。除此之外,只有页面的“主要内容区域”会有所不同


考虑到这些参数,如何对站点进行编码以获得最大的可维护性?

查看CFINCLUDE

您可以尝试一种支持模板的MVC框架(几乎每个人都有)


本页重点介绍每个框架如何处理模板…

使用ColdFusion有很多方法可以做到这一点


对每个请求都执行,并且有两种方法(
onRequestStart
onRequestEnd
)可用于在页面中向主脚本预编/追加内容

还值得注意的是,可以扩展/继承Application.cfc,从而允许更复杂的RequestStart/End事件集。和


允许您创建一个标记,可以围绕每个模板应用布局/etc。它还允许属性/etc定义常见但不断变化的文本

例如:

<cf_page PageTitle="My Page">
    [main page content]
</cf_page>

[主页内容]
在自定义标记(page.cfm)中,您有:

<cfif ThisTag.ExecutionMode EQ 'start'>
    <cfparam name="Attributes.PageTitle" default=""/>
    <cfcontent reset/><cfoutput><!DOCTYPE html>
    <html>
    <head>
        <title>My Website - #Attributes.PageTitle</title>
        [styles and scripts and stuff]
    </head>
    <body>
        <div id="heading">
            <img src="my_website_logo.png" alt="My Website"/>
        </div>
        <ul id="mainmenu" class="nav">
            [menu]
        </ul>
        <h1>#Attribute.PageTitle#</h1>
    </cfoutput>
<cfelse>
    <cfoutput>
        <div id="footer">
            [footer]
        </div>
    </body></html></cfoutput>
</cfif>

我的网站-#Attributes.PageTitle
[风格、脚本和内容]
    [菜单]
#Attribute.PageTitle# [页脚]
当然,您可以创建多个自定义标记,也可以创建一个根据指定属性以多种方式工作的标记


Henry已经提到了MVC框架,但是您不需要使用MVC来利用模板/布局功能

可以做MVC,但它不需要你这么做,而且FB的ContentVariables是一个很好的工具,可以用来实现模块化内容-除非你的首席开发人员可以证明他不喜欢Fusebox(并建议一个更适合你的项目的替代方案!)那么,绝对没有理由不去追求它——它是一个成熟和知名的框架,易于使用,有大量的开发人员,等等

然而,如果Fusebox真的不是一个选项,请看一看——该页面通常是一个巨大的工具列表,值得一看



无论如何,这应该给你足够的考虑,现在……

CaldFuxEclipse开发人员在90年代后期开始使用一个名为CFBBODYNEATION的自定义标签,以避免包括单独的页眉和页脚文件。那比ASP.NET的主页早了六七年

现在有一个本机标记做同样的事情:cfsavecontent。下面是人们如何在模板中使用cfsavecontent的要点

   <!--- index.cfm --->
   <cfsavecontent variable="content">
      <cfinclude template="#url.action#.cfm">
   </cfsavecontent> 

   <cfinclude template="template.cfm">

   <!--- template.cfm --->
   <cfparam name="title" default="Welcome">
   <html>
      <head><cfoutput>#title#</cfoutput></head>
      <body>
         ... header, menu, sidebar, whatever ...
         <cfoutput>#content#</cfoutput>
         ... right column, footer ...
      </body>
   </html>

   <!--- foo.cfm --->
   <cfset title="Welcome to Foo">
   Hello World! I'm the page at index.cfm?action=foo

   <!--- bar.cfm --->
   <cfset title="Welcome to Bar">
   Hello World! I'm the page at index.cfm?action=bar

#头衔#
... 标题、菜单、侧边栏等等。。。
#内容#
... 右栏,页脚。。。
你好,世界!我是index.cfm?action=foo的页面
你好,世界!我是index.cfm?action=bar的页面
如果要将模板放入模板中,只需添加另一个cfsavecontent即可

   <!--- index.cfm --->
   <cfsavecontent variable="content">
      <cfinclude template="#url.action#.cfm">
   </cfsavecontent> 

   <cfsavecontent variable="content">
      <cfinclude template="internal_template.cfm">
   </cfsavecontent>

   <cfsavecontent variable="content">
      <cfinclude template="master_template.cfm">
   </cfsavecontent>         

   <cfoutput>#content#</cfoutput>         

#内容#
您可以重构以消除冗余

   <!--- index.cfm --->
   <cfsavecontent variable="content">
       <cfinclude template="#url.action#.cfm">
   </cfsavecontent> 

   <cfparam name="templates" default="internal,master">

   <cfloop list="#templates#" index="t">
       <cfsavecontent variable="content">
           <cfinclude template="#t#_template.cfm">
       </cfsavecontent>
   </cfloop> 

   <cfoutput>#content#</cfoutput>  

#内容#
如果您想让一个模板“扩展”另一个模板,可以通过将列表转换为堆栈,并让每个模板将其父模板推送到堆栈上来实现

  <!--- internal_template.cfm --->
  <cfset templates = listAppend("master", templates)>  

  ...
  <cfoutput>#content#</cfoutput>
  ...


  <!--- index.cfm --->
  <cfsavecontent variable="content">
      <cfinclude template="#url.action#.cfm">
  </cfsavecontent> 

  <cfparam name="templates" default="internal">

  <cfloop condition="listlen(templates) gt 0">
      <cfset t = listFirst(templates)>
      <cfset templates = listRest(templates)>
      <cfsavecontent variable="content">
          <cfinclude template="#t#_template.cfm">
      </cfsavecontent>
  </cfloop> 

  <cfoutput>#content#</cfoutput> 

...
#内容#
...
#内容#

这样就有了StackBox,一个在StackOverflow上发明的ColdFusion框架。:-)

我曾经使用cfinclude包含在页眉、页脚和其他元素中,但我希望能有更强大的功能。自定义标记是一个好主意。谢谢你,彼得,非常棒的帖子。您可以添加的一件事是使用Application.cfc,您可以继承父onRequestStart/End以获得良好的主/子/孙页面效果,并调用超级方法。哦,还有Application.cfm/OnRequestEnd.cfm和cfc包含父文件来代替它。从未想过使用自定义标记来完成此操作…:)Nathan:是的,Application.cfc继承有点麻烦?为了完整起见,我将添加一个注释和链接。亨利:很多人忘记了自定义标签,但它们非常方便!在Railo 3.1中,可以编写带有组件的自定义标记-我还没有机会研究它是如何工作的,但这可能会使它们更加灵活…哈,在我意识到是谁发布了这个问题之前阅读这个问题。错过了.Net吗?哦,我也喜欢这个!也许我会这样做+1.