Model view controller 什么是ColdFusion Model Glue';相当于ASP.NET MVC 3';s@section?

Model view controller 什么是ColdFusion Model Glue';相当于ASP.NET MVC 3';s@section?,model-view-controller,asp.net-mvc-3,coldfusion,coldfusion-9,model-glue,Model View Controller,Asp.net Mvc 3,Coldfusion,Coldfusion 9,Model Glue,在ASP.NET MVC 3中,您可以在视图中有一个@部分: @section SideBar { <p>Some content</p> <p>Some more content</p> } <p>Body content</p> @节侧栏{ 一些内容 更多内容 } 身体内容 然后在主视图中,您将使用此选项渲染它: <div id="sidebar"> @RenderSection

在ASP.NET MVC 3中,您可以在视图中有一个
@部分

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

<p>Body content</p>
@节侧栏{
一些内容

更多内容

} 身体内容

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

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

@RenderBody()

@渲染部分(“侧栏”,false)
@RenderBody()
在Model Glue框架中,ColdFusion的等价物是什么?我知道我可以在视图中设置简单变量:

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

然后在主模板中使用它们,如下所示:

<cfif event.exists("section")><h3>#event.getValue("section")#</h3></cfif>
#event.getValue(“节”)#
但这只适用于单行程序和简单字符串。我想做的是包含一个完整的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>
SideBar.cfm:
一些内容

更多内容

Page.cfm: 身体内容

ModelGlue.xml: main.cfm: #viewCollection.getView(“侧栏”)# #viewCollection.getView(“主体”)#
我需要能够在
页面.cfm
视图中声明边栏内容。这里的想法是,在主模板的某个地方会有一个div,它允许一个小的HTML片段,比如一个带有文本描述和链接的图像,任何视图都可以填充它。像
Page1.cfm
Page1SidebarContent.cfm
Page2.cfm
Page2SidebarContent.cfm
,等等这样的东西是没有意义的。

(不幸的是)我已经很久没有接触过MG了,但我只是在谷歌上搜索了文档,以示提醒

您需要仔细阅读视图的工作原理,但本页文档对其进行了简要总结:

特别是以下代码段:

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

这可能是一个阅读文档的例子,提醒自己model glue是如何实现MVC的(具体来说是V部分!)。

我没有使用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>

#Request.subcent[PageName]。侧栏#
#getView(“默认的_边栏”)#
#viewCollection.getView(“主体”)#

根据事物的结构,您可能更喜欢将内容缓存在持久作用域中和/或将其隐藏在两个方法后面(甚至可能扩展Model Glue以允许以本机方式进行此操作;毕竟它是开源的),但希望这能给出一个大致的想法?

我现在明白您的意思了。我不确定MG是否会内置这种功能,因为在MVC环境中,要做这种事情实际上并不取决于视图:您在视图文件中将控制器和模型的东西耦合在一起。你这样做可能有一个很好的理由,但我想知道你的方法是否会让你在这里失败?你不能把“getthesidebar”的东西放到控制器中&让它调用一个模型,并在需要时添加一个sidebar视图吗?这就是我处理这件事的方法

也就是说,我知道让人们说“我不会回答你的问题,我只是想抱怨一下”是无济于事的,所以我会四处看看,看看能不能想出什么办法


然而,如果你想在这里突破MVC方法,也许不要试图让MG为你做这件事,只要按照Peter的建议去做,并在page.cfm视图中捕获一个变量,将它放在一个合理的结构化结构中(很好的同义反复,Cameron),然后在要渲染它的视图中查找它。

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

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

// 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>

#helpers.PageFragment.get(“侧栏”)#
为了避免保存所有片段,您可以创建一个customtag,使用thistag.generatedcontent和调用方作用域来访问您的助手


通过使用helpers封装功能,它非常容易重用,或者以后在不改变视图的情况下进行更改,例如,您可能需要添加缓存。

不幸的是,MG中的
viewcollection
要求您在
ModelGlue.xml
中包含单独的模板文件。我需要能够在一个视图中声明一个单独的部分。对于较大的元素(如导航),单独的文件是有意义的,但如果我只想为每个视图插入一个小的HTML片段,则不需要这样做。
是一样的,在另一个文件中包含一个单独的文件。我需要能够在一个视图中声明内容,并在主模板中的两个不同位置进行渲染。例如,主体部分是对一种动物的描述,还有一个单独的“有趣的事实”部分在别处呈现。嗯,我明白你的意思。我想使用它的目的是将一些Javascript代码粘贴到正文的底部,但我还想使其足够通用,以便您可以将任何HTML代码放在模板中的任何位置。谢谢Chris,您的回答帮助很大。