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 は、私が知る限り、個別のファイルを 1 つのテンプレートに結合する機能のみをサポートしています。

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.cfmand Page1SidebarContent.cfmPage2.cfmandなどのようなものがあるのは意味がありませんPage2SidebarContent.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>") />

main.cfm

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

すべてのフラグメントを cfsavecontent する必要がないようにするには、 thistag. generatedcontent と caller スコープを使用してヘルパーにアクセスする customtag を作成します。

ヘルパーを使用して機能をカプセル化することにより、再利用が非常に簡単になり、ビューを変更せずに後で変更することもできます。たとえば、キャッシュを追加することができます。

于 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

私はあなたが今何を意味するか分かります。MVC環境では、この種のことを行うのはビュー次第ではないため、MGにそのような機能が組み込まれるかどうかはわかりません。ビューファイルでコントローラーとモデルのものを結合するようなものです。 . あなたがこれを行うのには十分な理由があるかもしれませんが、ここであなたの元に戻すのはあなたのアプローチではないでしょうか? 「サイドバーを取得する」ものをコントローラーに入れて、モデルを呼び出し、必要に応じてサイドバー ビューを追加することはできませんか? それが私がこれにアプローチする方法です。

とはいえ、「あなたの質問に答えるつもりはない、ただ文句を言うだけだ」と言われても仕方がないことはわかっているので、周りを見回して、思いつくことができるかどうかを確認しますなにか。

ただし、ここで MVC アプローチから抜け出したい場合は、おそらく MG にこれを行わせようとしないでください。Peter が提案することを実行して、page.cfm ビューで変数をキャプチャし、それを賢明に構造化された構造体 (いいトートロジー、キャメロン) を探して、レンダリングしたいビューでそれを探します。

于 2011-09-01T07:50:05.403 に答える