2

在ASP.NET MVC 3,你可以有一個視圖中的@section什麼是ColdFusion Model Glue相當於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() 

,會是什麼在模型膠框架中的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)> 

但我想知道是否有更好的方式來做到這一點。

編輯:

針對亞當·卡梅隆的回答,型號膠水,從我所知道的,只支持單獨的文件合併成一個模板的能力:

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.cfmPage1SidebarContent.cfmPage2.cfmPage2SidebarContent.cfm,等...

回答

2

ModelGlue不支持您想要開箱即用的功能。然而它很容易實現使用彼得的建議和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> 

爲了避免給cfsavecontent你可以創建一個所有的片段customtag使用thistag.generated內容和調用者範圍訪問您的助手。

通過使用幫助程序來封裝功能,它真的很容易重用,或稍後更改而不更改您的視圖,例如,您可能想要添加緩存。

+0

謝謝克里斯,你的回答幫了很多。 –

2

(可惜)我沒碰過MG的年齡,但我只是用Google搜索的文檔,作爲提醒。

你需要了解如何看法讀了工作,但該文檔的這一頁總結言簡意賅:

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

具體的代碼片段:

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

這可能是一個通過閱讀文檔的一些情況,並提醒自己如何模型膠水的MVC(特別是V部分,在你的情況!)的作品。

+0

不幸的是,MG中的'viewcollection'需要在'ModelGlue.xml'中包含**獨立的**模板文件。我需要能夠在一個視圖中聲明一個單獨的部分。單獨的文件對於較大的元素(如導航)有意義,但如果我只是想爲每個視圖插入一個小的HTML代碼段,則不是。 –

+0

好老''會做伎倆 – Henry

+0

''是一樣的東西,在另一個文件中包含一個**分開的**文件。我需要能夠在一個視圖中聲明內容並在主模板的兩個不同位置渲染出來。例如,主體是一個動物的描述,帶有一個單獨的「有趣的事實」部分,在其他地方呈現。 –

0

我沒有使用模型膠水也不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> 

然後在主。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> 

根據事物的結構如何,你可能更喜歡在持久範圍緩存內容和/或後面躲起來,一對夫婦的方法(甚至可能擴展模型膠原生地允許此,它畢竟是開源的),但希望這給出了一個總體思路?

0

我明白你的意思了。我不確定MG是否具有內置的這種功能,因爲在MVC環境中,並不是真的需要做這樣的事情:你有點兒把一些東西耦合到一個視圖文件中。你這樣做可能有一個很好的理由,但我想知道你的方法可能是你在這裏解決的嗎?你能不能把「獲得側邊欄」的東西放入控制器&有調用模型,並添加一個側欄視圖,如果需要?那就是我如何處理這件事。這就是說,我知道如果有人說「我不會回答你的問題,我只是會抱怨它」,所以我會看看周圍,看看我是不是有幫助可以拿出一些東西。

但是,考慮到您希望在此打破MVC方法,也許不要試圖讓MG爲您做到這一點,只是做Peter建議並捕獲page.cfm視圖中的變量,將它粘貼在一個明智結構的結構(好的重言式,卡梅隆)中,然後在你想渲染的視圖中查找它。

+0

嗯,我明白你的觀點。我想要使​​用的是將一些Javascript代碼粘貼到主體的底部,但我也想使其足夠通用,以便可以將任何HTML代碼放在模板中的任何位置。 –

相關問題