【问题标题】:Output custom RenderModel for all Umbraco 4.10 MVC routes为所有 Umbraco 4.10 MVC 路由输出自定义 RenderModel
【发布时间】:2012-11-20 17:47:28
【问题描述】:

有没有办法覆盖默认的 RenderMvcController 来为每个路由输出一个自定义的 RenderModel。这可能是通过劫持路线,但我想放置一些将在每个页面上使用的自定义数据。

例如,在电子商务网站上,每个页面都显示购物篮信息。理想情况下,这将在每个视图的 RenderModel 中可用。有没有办法将默认控制器更改为自定义控制器,以输出带有篮子属性的扩展渲染模型?

更新:

Umbraco 6.1.0+ 现在支持此功能,文档位于本页末尾:http://our.umbraco.org/documentation/Reference/Mvc/custom-controllers

【问题讨论】:

  • 我认为这是 Umbraco v4.10?
  • 嗨,是的,它是 v4.10,我已经更新了问题以明确说明

标签: asp.net-mvc asp.net-mvc-routing umbraco


【解决方案1】:

我会考虑的解决方案不是尝试将自定义数据撬入 Umbraco 的默认页面模型,而是考虑使用 BasketSurfaceController 并使用 @Html.Action("HeaderDisplay", "BasketSurface") 或类似的东西将购物篮内容呈现到屏幕上。这样您就可以保持视图模型的独立性,并将其显示为_Layout.cshtml 的一部分或您需要的特定页面上。

同样使用这种方法,您可以维护一组特定的篮子相关视图,这些视图全部由同一个控制器提供,与 Umbraco 的模型完全分离。

有关详细信息,请参阅Child Actions 上的文档。

更新:

在重新阅读文档时,我可以看到这在 4.10+ 中是可能的,而且非常容易。 documentation is here 但简而言之,您可以覆盖对每种文档类型的请求或通过替换默认控制器来覆盖所有请求。

虽然我仍然主张在这种特殊情况下使用 ChildAction 方法,但重写文档类型控制器以传递自定义视图模型对于传递特定于页面的预制模型(例如博客条目)来说是理想的与 cmets.关联类别)和/或传递一个模型,该模型包含页面本身不可用但每个页面都需要的数据(例如站点名称、域、区域设置、全局跟踪/附属代码、元数据)。

【讨论】:

  • 这就是我目前正在做的事情,不幸的是,这意味着每次在动作中使用篮子时我都会加载篮子。在一个标准的 MVC 项目中,我将它加载一次,然后它将在视图模型中可用。但看起来我不能用 Umbraco 4.10 中的当前 MVC 实现来做到这一点
  • 您每次都会加载购物篮,即使它在 Umbraco 的页面模型中,因为它是在逐个请求的基础上创建的。我认为 ChilsAction 方法至少意味着如果数据库调用是一个问题,您可以分离逻辑并从会话构建输出。
  • 但是我可能会在一个请求中在几个不同的地方使用购物篮,例如查看购物篮页面可能会将它放在页眉、主页内容和页脚中
  • 不要忘记每个请求都会创建一个控制器实例,因此您可以允许在 Context.Items 集合中保存和访问购物篮信息。或者,使用 Session、TempData 对象,甚至扩展 Controller 本身。
猜你喜欢
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多