2

在 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 片段,比如一个带有文本描述和链接的图像,任何视图都可以填充。Page1.cfm有类似and Page1SidebarContent.cfm, Page2.cfmandPage2SidebarContent.cfm等的东西是没有意义的......

4

4 回答 4

2

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

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

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

特别是这段代码片段:

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

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

于 2011-08-31T10:20:43.563 回答
2

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;
 }
}

然后在你看来你可以做

索引.cfm

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

主文件

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

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

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

于 2011-09-01T08:41:02.410 回答
0

我没有使用过 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 以允许本机这样做;毕竟它是开源的),但希望这给出一个总体思路?

于 2011-08-31T17:18:38.673 回答
0

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

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

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

于 2011-09-01T07:50:05.403 回答