0

我有一些 N2 CMS 系统中存在的操作指南页面,我想在普通 MVC 视图的底部包含其中的一两个。我已经设法使用 N2 API 来拉回控制器中特定页面的 ContentItem 使用:

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

现在我希望它就像拉回这个内容项然后要求 N2 在视图中呈现相关页面/部分一样简单,但是我无法找到任何文档或信息,说明这是否可能或如何我会去做的。

谁能指出我正确的方向?

谢谢。:)

4

1 回答 1

0

我找到了解决我的问题的方法。

它几乎就像告诉 N2 CMS 呈现ContentItem一样简单(ish),您可以Html.DroppableZone()通过将 ContentPage 传递给它来使用它... ish...

Html.DroppableZone()可以接受 aContentItem和 "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部分的页面)
  • 然后将其传递ContentItem给索引视图

仅供参考:我们将使用 AJAX 按需绘制它,因此它只返回部分......您可以使用return View(contentItem);Layouts 等来绘制整个页面......

看法

现在在视图中:

@@使用 N2 @model 内容项

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

}

视图循环通过 ContentItem 的子项,并且对于它找到的与ServiceTemplate我们正在寻找的部分匹配的每个子项,它使用Html.DroppableZone()将整个页面的 ContentItem 和 ContentItem 的ZoneNamethis传递给它的函数来呈现它ServiceTemplate

所以正如我所说的“简单! ” ;)

于 2016-11-04T11:31:37.803 回答