2011-05-29 55 views
14

我是新来的果园,所以我可能不知道我在做什么。你如何覆盖Orchard CMS中导航区域的渲染?

我已经想出了如何覆盖不同的形状,但将一个cshtml文件放在与文件形状相同的视图文件夹中。

另外,我在Core Orchard文件下找到Menu和MenuItem形状cshtml文件。

但是,我没有看到一个名为Navigation的形状,我并不真正了解Zones的工作方式。

我搜索了代码,无法弄清楚导航是如何渲染的,尽管我找到了一些代码。

我想重写导航渲染的原因是它在UL周围呈现DIV和NAV标签。我宁愿只渲染NAV和UL。

回答

11

区域也是形状,但它们是在代码中声明的(Core/Shapes/CoreShapes.cs),而不是像大多数形状的.cshtml文件。此外,没有称为导航的形状,因为区域是在运行时动态创建的 - 这些区域的名称由所使用的主题提供。

区域具有Zone __ [ZoneName]形式的默认备选项。这意味着你只需要将Zone-Navigation.cshtml文件放置在主题文件夹中的/ Views文件夹中,以覆盖导航区域渲染。

+0

谢谢。这很有效,但我不知道如何使用导航数据呈现菜单形状,或者如何访问导航数据以便自己构建菜单。调用@Display(Model.Menu)不起作用。 – Zack 2011-05-30 00:54:29

+4

* Menu *(呈现'nav'元素)和* MenuItem *(呈现单个项目)是形状,因此您可以通过将* Menu.cshtml *和/或* MenuItem.cshtml *文件放入您的主题* /查看*文件夹。看看默认的渲染方式 - 你可以在* Core/Shapes/Views *文件夹中找到它们。顺便说一句 - @Display()方法用于渲染一个形状对象(应该提供这样的对象)。如果您需要手动渲染区域内容 - 将模型(保存当前区域形状对象)投射到IEnumerable 并为每个项目调用显示(项目)。 – 2011-05-30 02:42:00

+0

澄清:每个形状对象(可在.cshtml文件中作为Model属性提供)实现一个IEnumerable接口,并且可以包含其他子形状(例如,导航区域中的菜单形状)。这就是为什么你可以自由地将它转换为IEnumerable 并在foreach循环中访问子项(如果有的话)。 – 2011-05-30 02:48:46