0

N2 CMS システムにいくつかのハウツー ページがあり、そのうちの 1 つまたは 2 つを通常の MVC ビューの下部に含めたいと考えています。以下を使用して、N2 API を使用して、コントローラー内の特定のページの ContentItem を引き戻すことができました。

ContentItem contentItem = global::N2.Context.Current.UrlParser.Parse("/support/sample-code/example-one");

このコンテンツ アイテムを元に戻し、N2 に関連するページ/パーツをビュー内の適切な場所にレンダリングするように依頼するのと同じくらい簡単なことを望んでいましたが、これが可能かどうか、またはその方法についてのドキュメントや情報を見つけることができませんでした。私はそれについて行きます。

誰かが私を正しい方向に向けることができますか?

ありがとう。:)

4

1 に答える 1

0

問題の解決策を見つけました。

N2 CMS にContentPageを渡すことで使用できるように ContentItem をレンダリングするように指示するのと同じくらい簡単です... ishHtml.DroppableZone() ...

Html.DroppableZone()ContentItemと "ZoneName" ( )を受け入れることができstring、指定された ZoneName を、 に含まれるページ上にあるかのようにレンダリングしますContentItem。これは、ページをレンダリングしていないことを意味しますがPart、私たちの場合、レンダリングしたいすべてのページには、他のページにレンダリングしたいすべての情報を含む「ServiceTemplate」と呼ばれる部分が含まれているため、問題ありません。ページ。

(ただし、ページ全体が必要な場合は、元のページのビューを使用してパーツのレイアウトを取得する方法を考え出すこともできます...試してみたところ、多くの問題が見つかったので幸運を祈ります@section main{...}... )

コントローラ

かなり紛らわしいので、ここにコントローラーを示します。

using System.Linq;
using System.Web.Mvc;
using N2;

namespace Data8.Website.N2.Controllers
{
    public class ServiceDocsController : Controller
    {
        // GET: ServiceDocs
        // Returns the specified service doc (partial view for AJAX)
        public ActionResult Index(string url)
        {
            // Get the Content Item for that N2 Page (if it is an N2 Page!)
            ContentItem contentItem = Context.Current.UrlParser.Parse(url);

            // Ensure we found a valid N2 Content Page that contains a Service Template as one of it's parts... (these are all we will render!)
            if (contentItem == null || !contentItem.IsPage || contentItem.Children.All(ci => ci.TemplateKey != "ServiceTemplate"))
            {
                return new HttpNotFoundResult("Page doesn't exist or doesn't contain a Service Template Part!");
            }

            // Return the partial view of that contentItem
            return PartialView(contentItem);
        }
    }
}

これ:

  • 必要なページの URL を取得します
  • を使用して、そのページのN2 UrlParserを検索しますContentItem
  • それが私たちが望むページのタイプであることを確認してください(私たちはその上に部分のあるページの後にのみありますServiceTemplate
  • 次に、それをContentItemIndex ビューに渡します

参考: AJAX を使用してこれをオンデマンドで描画するので、部分的なものしか返されません...return View(contentItem);代わりに、レイアウトなどでページ全体を描画するために使用できます...

意見

ビューで:

@ @using N2 @model ContentItem

@foreach (ContentItem contentItem in Model.Children)
{
    if (contentItem.Visible && contentItem.ZoneName != null && !contentItem.IsPage && contentItem.TemplateKey == "ServiceTemplate")
    {
        @Html.DroppableZone(Model, contentItem.ZoneName).Render()
    }

}

ServiceTemplateビューは ContentItem の Children をループし、探している Part に一致する子を見つけるたびHtml.DroppableZone()に、ページ全体の ContentItem とZoneNamethisの ContentItem を渡す関数を使用してレンダリングしますServiceTemplate

私が言ったように「シンプル!」;)

于 2016-11-04T11:31:37.803 に答える