【问题标题】:What is ColdFusion Model Glue's equivalent to ASP.NET MVC 3's @section?ColdFusion Model Glue 相当于 ASP.NET MVC 3 的 @section 是什么?
【发布时间】:2011-08-31 08:52:32
【问题描述】:

在 ASP.NET MVC 3 中,您可以在视图中拥有 @section

@section SideBar {
    <p>Some content</p>
    <p>Some more content</p>
}

<p>Body content</p>

然后在主视图中,您将使用它来渲染它:

<div id="sidebar">
    @RenderSection("SideBar", false)
</div>

@RenderBody()

在 Model Glue 框架中与此等效的 ColdFusion 是什么?我知道我可以在视图中设置简单的变量:

<cfset event.setValue("section", "Tables")>

然后像这样在主模板中使用它们:

<cfif event.exists("section")><h3>#event.getValue("section")#</h3></cfif>

但这仅适用于单行和简单的字符串。我想做的是包含整个 HTML 块。实现这一目标的最佳方法是什么?我认为这在理论上可行:

<cfsavecontent variable="sidebar">
    <p>Some content</p>
    <p>Some more content</p>
</cfsavecontent>

<cfset event.setValue("sidebar", sidebar)>

但我想知道是否有更好的方法。

编辑:

针对 Adam Cameron 的回答,据我所知,Model Glue 仅支持将单独的文件合并到一个模板中的功能:

SideBar.cfm:
<p>Some content</p>
<p>Some more content</p>

Page.cfm:
<p>Body content</p>

ModelGlue.xml:
<event-handler name="page.text">
    <views>
        <include name="sidebar" template="SideBar.cfm"/>
        <include name="body" template="Page.cfm"/>
        <include name="main" template="main.cfm"/>
    </views>
</event-handler>

main.cfm:
<cfoutput>#viewCollection.getView("sidebar")#</cfoutput>
<cfoutput>#viewCollection.getView("body")#</cfoutput>

我需要能够page.cfm 视图中声明侧边栏内容。这里的想法是在主模板的某个地方会有一个 div,它允许一个小的 HTML sn-p,比如一个带有文本描述和链接的图像,任何视图都可以填充。有Page1.cfmPage1SidebarContent.cfmPage2.cfmPage2SidebarContent.cfm 之类的东西是没有意义的......

【问题讨论】:

    标签: model-view-controller asp.net-mvc-3 coldfusion coldfusion-9 model-glue


    【解决方案1】:

    ModelGlue 不支持您想开箱即用的操作。然而,使用 Peter 的建议和 ModelGlue 助手进行封装很容易实现。

    创建一个新的 cfc,将其命名为 PageFragment.cfc 并将其放入您的 ModelGlue 助手目录中。

    // untested!
    component name="PageFragment" {
     public boolean function exists(string name) {
      return structkeyexists(request.subcontent, arguments.name);
     }
    
     public string function get(string name) {
      if(exists(arguments.name)) return request.subcontent[arguments.name];
      return "";
     }
    
     public void function set(string name, string value) {
      request.subcontent[arguments.name] = arguments.value;
     }
    }
    

    那么在你看来你可以做

    index.cfm

    <cfset helpers.PageFragment.set("sidebar", "<p>My sidebar content</p>") />
    

    main.cfm

    <cfif helpers.PageFragment.exists("sidebar")>
      <div id="sidebar">#helpers.PageFragment.get("sidebar")#</div>
    </cfif>
    

    为避免必须 cfsavecontent 您的所有片段,您可以创建一个自定义标签,使用 thistag.generatedcontent 和调用者范围来访问您的助手。

    通过使用帮助器来封装功能,它真的很容易重用,或者以后在不改变视图的情况下进行更改,例如,您可能想要添加缓存。

    【讨论】:

    • 谢谢克里斯,你的回答很有帮助。
    【解决方案2】:

    (很遗憾)我已经很久没有接触过 MG 了,但我只是在 Google 上搜索了一下文档,以提醒一下。

    您需要阅读 views 的工作原理,但此文档页面简洁地总结了它:

    http://docs.model-glue.com/wiki/ReferenceMaterials/ViewApi#ViewAPI

    具体这段代码sn-p:

    <cfoutput>#viewcollection.getView("body")#</cfoutput> 
    

    这可能是一个阅读文档的案例,并提醒自己模型胶水的 MVC 实现(特别是 V 部分,在您的案例中!)是如何工作的。

    【讨论】:

    • 不幸的是,MG 中的viewcollection 要求您在ModelGlue.xml 中包含单独的 模板文件。我需要能够在一个视图本身中声明一个单独的部分。单独的文件对于较大的元素(如导航)有意义,但如果我只想为每个视图插入一个小的 HTML sn-p 则不是。
    • &lt;cfinclude&gt; 是一回事,包括在另一个文件中的 单独 文件。我需要能够在一个视图中声明内容,并在主模板的两个不同位置呈现。例如,主体是对动物的描述,在其他地方呈现单独的“有趣的事实”部分。
    【解决方案3】:

    我没用过Model-Glue也没有用过ASP.NET MVC,不过看来你想要的可以这样实现:

    在 page.cfm 中执行:

    <cfsavecontent variable="Request.SubContent['ThisPage'].Sidebar">
        <p>Some content</p>
        <p>Some more content</p>
    </cfsavecontent>
    
    <p>Body content</p>
    

    然后在 main.cfm 中使用:

    <div id="sidebar">
        <cfif StructKeyExists(Request.SubContent,PageName)
            AND StructKeyExists(Request.SubContent[PageName],'Sidebar')
            >
            #Request.SubContent[PageName].Sidebar#
        <cfelse>
            #viewCollection.getView("default_sidebar")#
        </cfif>
    </div>
    
    <cfoutput>#viewCollection.getView("body")#</cfoutput>
    

    根据事物的结构,您可能更喜欢将内容缓存在持久范围内和/或将其隐藏在几个方法后面(甚至可能扩展 Model-Glue 以允许本机这样做;毕竟它是开源的),但希望这能提供一个总体思路?

    【讨论】:

      【解决方案4】:

      我现在明白你的意思了。我不确定 MG 是否会内置这种功能,因为在 MVC 环境中,做这种事情并不取决于视图:你有点将控制器和模型东西耦合在一个视图文件中.您这样做可能有充分的理由,但我想知道您的方法是否可能会导致您的失败?您能否不将“获取侧边栏”的内容放入控制器并调用模型,并在需要时添加侧边栏视图?这就是我的处理方式。

      也就是说,我知道让人们说“我不会回答你的问题,我只会抱怨它”是没有帮助的,所以我会四处看看,看看我是否可以想办法。

      但是,鉴于您想在这里突破 MVC 方法,也许不要试图让 MG 为您执行此操作,只需按照 Peter 的建议并在 page.cfm 视图中捕获一个变量,坚持它在一个结构合理的结构中(很好的重言式,Cameron),然后在要渲染它的视图中查找它。

      【讨论】:

      • 嗯,我明白你的意思了。我想使用它的目的是将一些 Javascript 代码粘贴到正文的底部,但我也想让它足够通用,以便您可以将任何 HTML 代码放在模板中的任何位置。
      猜你喜欢
      • 2019-11-14
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多