Umbraco MVC实现 - View不依赖于Umbraco实现

时间:2013-08-19 09:26:47

标签: asp.net-mvc razor umbraco

我已经按照这个很好的教程解释了如何利用Umbraco作为内容传送系统的更多优势。 Tutorial MVC Umbraco =>您的模型和视图不应该依赖于特定的Umbraco实现,这对于真正的前端开发人员来说是一个巨大的优势。

控制器继承自Umbraco.Web.Mvc.RenderMvcController,以便从CMS访问数据。 现在我的问题是我们不能使用@ HTML.actionlink进行导航,似乎只支持SurfaceController。

现在我的问题是我们如何在Umbraco.Web.Mvc.RenderMvcController中实现导航?我们还可以使用native @ HTML.actionlink标记吗?

1 个答案:

答案 0 :(得分:1)

不,你不能。仅仅因为所有请求都通过单个操作。要检索CMS管理页面的路径,您需要使用@Model提供的节点/内容遍历。请参阅此处的more details

修改

为了澄清,文章的作者建议Umbraco实现应该更符合传统的MVC实现,在视图中很少或没有逻辑。因此,任何查询节点数据都应该在视图之前进行(例如在Mappers中)。所以这是你必须检索链接的地方。

Umbraco的默认MVC实施强制所有请求通过单个控制器上的单个操作进行。作者的实现允许每个文档类型在一个控制器之间共享请求 - 这是更好的IMO。但它仍然意味着Html.ActionLink之类的内容在视图中是多余的,因为每页都没有操作。

进一步修改

如果您想构建一个包含Umbraco管理页面和非Umbraco页面组合的导航列表,无论实现如何,我都会:

  1. 在继承自NavigationController
  2. 的单独SurfaceController中创建子操作并查看导航
  3. 使用继承的this.CurrentPage的{​​{1}}属性遍历Umbraco内容缓存,以检索相关的Umbraco管理的页面。然后,您可以使用每个页面结果的SurfaceController属性来获取其路径,并使用Url属性来获取页面标题
  4. 使用Name检索特定非Umbraco操作的路径。或者,如果页面是数据库管理的,此时使用数据层(例如EF,NHibernate,PetaPoco)
  5. 将这些内容组合在一个词典中,以便在this.Url.Action("action", "controller")为路径且Key为页面标题
  6. 的位置制作所需的列表
  7. 将其作为视图模型传递给视图。
  8. 当然还有更多需要考虑的事情,比如缓存,但简而言之,这是一个相当基本的实现。